输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
数据范围:
即范围为:
10
2
十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。
-1
32
负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1
int NumberOf1(int n ) { // write code here int sum=0,m; //sum用于记录1的个数,m用于记录正数情况下取余的结果 if(n>0){ //正数比较简单,直接转换二进制数个数即可 while(1){ m=n%2; if(m==1) sum++; n=n/2; if(n==0) break; } return sum; } if(n<0){ //原始方法求补码 n=-1*n; //先变成正数 int a[32]; for(int i=31;i>=0;i--){ //用a数组记录n的正数的二进制数 a[i]=n%2; n=n/2; } a[0]=1; //符号位取反 for(int i=1;i<=31;i++){ //除符号位外各位0变1,1变0 if(a[i]==0){ a[i]=1; continue; } else{ a[i]=0; continue; } } a[31]=a[31]+1; //整体+1 for(int i=31;i>0;i--){ //考虑+1后的进位问题 if(a[i]==2) a[i-1]=a[i-1]+1; } if(a[0]==2) a[0]=1; //高位产生溢出时,符号位为1不变,应对-2147483648 for(int i=0;i<32;i++){ //求1的个数 if(a[i]==1) sum++; } return sum; } return 0; }
int NumberOf1(int a ) { // write code here int count = 0; if (a >= 0) { while (a) { if (a & 1) {//可以判断出当前a最后一位是1还是0 count++; } a = a >> 1; } } else { //负数右移,我这个编译器是算术右移(大多数编译器都是算术右移) //算术右移就是,最右边数丢弃,左边补符号位,因为是负数也就是补1 //这里如果还用while(a)就会一直死循环下去,因为左边会一直补1 //但我们是知道整形是32位存储在内存里面的,我们循环32次即可 for (int i = 0;i < 32;i++) { if (a & 1) {//可以判断出当前a最后一位是1还是0 count++; } a = a >> 1; } } return count; }
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @return int整型 * * C语言声明定义全局变量请加上static,防止重复定义 */ int NumberOf1(int n ) { // write code here // int i = 0; // int count = 0; // while (i < 32) // { // if (n & 1<<i) // { // count++; // } // i++; // } // return count; int count = 0; while (n != 0) { n = n & (n-1); count++; } return count; }