【题目】
给定一个32位整数n,可为0,可为正,也可为负,返回该整数二进制表达式中1的个数
【分析】
按位与(&)操作可以充当掩码的作用,即,可以屏蔽某些位
对整数n每次进行无符号右移1位,并检查最后一位是否为1来进行统计该整数二进制表达式中1的个数
方法一:
1 public int binaryOneNum(int num) 2 { 3 int res = 0; // 记录num二进制表达式中1的个数 4 while(num != 0) 5 { 6 res += num & 1; // 根据最后一位是否为1来更新res 7 num >>>= 1; // 无符号右移1位 8 } 9 10 return res; 11 }
方法二:
1 public int binaryNum(int num) 2 { 3 int res = 0; 4 5 while(num != 0) 6 { 7 num &= (num - 1); 8 res++; 9 } 10 11 return res; 12 }
方法三:
1 public int binaryNum(int num) 2 { 3 int res = 0; 4 5 while(num != 0) 6 { 7 num = num - (num & (~num + 1)); 8 res++; 9 } 10 11 return res; 12 }
来源:左程云老师《程序员代码面试指南》