位运算以及位的左移和右移

    1、左移:m<<n。左移n位的时候,最左边的n位将被丢弃,最右边补上n个0。00001010<<2=0010100。10001010<<3=01010000

    2、右移:m>>n。

    (1)无符号数值:最右边n位被丢弃,最左边用0填补。

    (2)有符号数值:用符号数填补最左边。原先是0即正数,则用0填补。


    1、二进制中1的个数:

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

    答题思路:把一个整数减去1,再和原整数做与运算,会把该整数最右边的1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

    public int NumberOf1(int n) {

        int count=0;

        while(n!=0){

            count++;

            n=(n-1)&n;

        }

        return count;

    }

    2、位运算中异或的用法

    (1)题目一:一个数组中,除了有一个数字是单次出现,其他数字都是偶数对出现,求出这个数字?

        答题思路:利用异或的思想,如果两个数字相同,那么这两个数字异或之后变为0.因此将这个数组中的数字依次异或,剩下的数字便是单个出现的数字

    (2)题目二:一个数组中,有两个数字时单个出现的,其他的都是偶数对出现,求这两个数字?

        答题思路:

        a、看到题目一,可以联想到,将这个题目的数组分为两份就可以求出。

        b、怎么分为两份呢?具体参考剑指offer面试题56

    

 


版权声明:本文为weixin_40369899原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。