剑指Offer面试题15:二进制中1的个数

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

基本知识点: 位运算

剑指Offer面试题15:二进制中1的个数_第1张图片

解题代码:

       1 基本解法

class Solution {
public:
     int  NumberOf1(int n) {
         int count=0;
         unsigned int flag=1;
         while(flag)
         {
             if(n&flag) //位与
                 count++;
             flag=flag<<1;
         }
         return count;
     }
};

       2进阶解法

int NumberOf1(int n )
{
    int count = 0;
    while(n)
    {
        ++count;
        n=(n-1)&n;
    }
   return count;
}

相关题目:

    1.用一条语句判断一个整数是不是2的整数次方

boolean isFactorialofTwo(int n){
	return n > 0 ? (n & (n - 1)) == 0 : false;
	/*如果是2的幂,n一定是100... n-1就是1111....
	   所以做与运算结果为0*/
}

    2.输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n.

更多关于位运算的奇技淫巧参看博客:(值得学习!!!

【1】https://blog.csdn.net/deaidai/article/details/78167367

【2】https://blog.csdn.net/zmazon/article/details/8262185

【3】https://blog.csdn.net/riba2534/article/details/79835188

 

补充:关于0x80000000存储和表示问题 十六进制负数表示

  • (1)十进制负数以补码存储于内存上

          -8的在内存上存储形式:      1000

  • (2)十六进制负数以原码存储在内存上

          int i = 0x80000001
          // i=-1在内存上表示为 10...01

  • (3)0x80000000的表示值

          0x80000000的值为 -2^31
          1后面的31位表示序号位,0...0【类似于数组中的0号位】,表示负数中的最小的一位。由于int的最小值为-2^31,排在负数              从小到大的第0位,所以int i = 0x80000000 为 -(2^31)+ 0 = -2^31

  • (4)十进制的补码也符合符号位+序号位的原则

          以-1为例,其补码为 1..1
          11...1序号位为第2^31 -1位
           所以其值为 -2^31 + 2^31 -1 = -1 符合预期
 

你可能感兴趣的:(菜鸟通关剑指Offer)