题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题目分析:无论使用什么方式,最关键的就是要考虑负数的处理方式
public class NumberOfOne { //方法一: 最优解 public static int numberOfOnes(int n){ int count =0 ; while (n!=0){ n = n & (n-1); count++; } return count; } //方法二:考虑一下Java对应的数据类型的移位处理规则 public static int numberOfOnes1(int n){ int count = 0; int flag = 1; while (flag!=0 ){ if ((n & flag) !=0 ){ ++count; } flag = flag << 1; } return count; } public static void main(String[] args){ // System.out.println(numberOfOnes(-3)); System.out.println(numberOfOnes1(-2)); } }
扩展一下:
1. 用一条语句判断一个整数是不是2的整数次方
答:判断这个整数的二进制表示的1的个数是不是1个即可。
2. 输入两个整数m和n,计算需要改变m的二进制表示中多少位才能得到n。
答:分两步:1)求这两个数的异或,2)统计异或结果中1的个数