剑指offer

15_二进制中1的个数

2020-05-19  本文已影响0人  是新来的啊强呀

要求:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:把1的二进制数每次往左移一位,

public static int NumberOfOne(int number){
        int cout = 0;
        int flag = 1;
        while(flag!=0){
            if((flag&number)!=0){
                // 进行与运算
                cout++;
            }
            flag = flag<<1;  // 左移一位
        }
        return cout;
    }

位运算相关知识:
1、左移运算m<<n表示把m左移n位,在左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0
2、右移运算m>>n表示有移n位,最右边的n位将被丢弃,若数字是一个无符号数值,则用0填补最左边的n位,若有符号,则符号位填补,即最左边补n个1。
3、把整数右移一位和把整数除二在数学上是等价的,但除法的效率更低
4、正数的补码,原码,反码数一致的。
5、负数的补码是反码加一,反码是原码按位取反,只是最高位不变(符号位)
6、计算机运行时基于补码的
7、负数的补码为模减去该数的绝对值(如,-5的补码为256-5=251=>11111011)

上一篇下一篇

猜你喜欢

热点阅读