位运算
位运算是把数字用二进制表示之后,对每一位上 0 或者 1 的运算。
因为位运算总共只有五种运算:与,或,异或,左移和右移
与(&) 0&0=0 1 & 0 = 0 0 & 1 = 0 1 & 1 = 1
或(|) 0 | 0 = 0 1 | 0 = 1 0 | 1 = 1 1 | 1 = 1
异或(^) 0^0=0 1^0=1 0^1 = 1 1 ^ 1 = 0
左移运算符 m << n 表示把 m 左移 n 位。
左移 n 位 的时候,最左边的 n 位将被丢弃,同时在最右边补上 n 个 0.比如:
00001010 << 2 = 00101000
10001010 << 3 = 01010000
右移运算符 m >> n 表示把 m 右移 n 位。
如果数字原先是一个正数,则右移之后在最左边补 n 个 0;如果数字原先是负数,则右移之后在最左边补 n 个 1.
00001010 >> 2 = 00000010
10001010 >> 3 = 11110001
题目描述:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解题思路:
方法一:用1(循环左移)与n的每一位进行位与,来判断1的个数;注意,如果用n进行循环右移,一定要注意负数的情况,因为如果是负数,n右移之后高位补位为1,如果一开始不对n加以判断和处理,就会进入死循环。
方法二:目前我认为最优的解。n=(n-1) & n;
举个栗子:一个二进制数n为1100,那么n-1为1011,1011&1100=1000,我们会发现,这样操作之后,相当于把n最右边的一个1变为0,那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
方法三:python的解法给了我另一种思路,为什么不用位数作为循环终止条件呢?
python 代码实现:
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
return sum([(n>>i & 1) for i in range(0,32)])
用一条语句判断一个整数是不是 2 的整数次方。一个整数如果是 2 的整数次方,那么它的二进制表示中有且只有一位是 1,而其他所有位都是 0。