Java统计数字二进制表示中1的个数问题详解(DS&A入门)
统计数字二进制表示中1的个数(Java实现详解)
方法一:逐位检查(最易理解)
思路直白:每次判断数字最后一位是否为1,然后将数字无符号右移一位,重复操作直到数字变为0。
Java代码示例:
public class CountOneBits { public static int countOnes(int n) { int count = 0; while (n != 0) { // 最后一位和1按位与,结果为1说明最后一位是1 if ((n & 1) == 1) { count++; } // 无符号右移,避免负数补1导致死循环 n = n >>> 1; } return count; } public static void main(String[] args) { System.out.println(countOnes(5)); // 5的二进制是101,输出2 System.out.println(countOnes(-3)); // -3的补码含31个1,输出31 } }
解释:
n & 1:按位与操作,仅当n最后一位为1时返回1,否则返回0。n >>> 1:无符号右移,无论正负左边都补0,避免负数用>>右移时一直补1导致死循环。
方法二:高效技巧(利用n & (n-1))
核心原理:n与n-1按位与,会消除n最右侧的1。比如n=5(101),n-1=4(100),5&4=4(100),最右侧的1被消除;再执行4&3=0,共操作2次,对应2个1。
Java代码示例:
public class CountOneBits { public static int countOnes(int n) { int count = 0; while (n != 0) { count++; // 消除最右侧的1 n = n & (n - 1); } return count; } public static void main(String[] args) { System.out.println(countOnes(5)); // 输出2 System.out.println(countOnes(-3)); // 输出31 } }
解释:
- 循环次数等于数字中1的个数,比逐位检查效率更高,尤其当1的数量较少时。
- 负数同样适用,因为Java中负数以补码存储,该操作对补码同样有效。
方法三:Java内置方法
Java提供了现成的工具方法,直接调用即可:
int count = Integer.bitCount(n);
该方法底层基于n & (n-1)的高效逻辑实现,适合快速开发场景。
内容的提问来源于stack exchange,提问作者Tech Man
相关产品推荐
相关产品推荐

