位运算
把数字用二进制表示之后,对每一位上0或者1的运算。
包含五种运算:与、或、异或、左移、右移。
- 左移:
运算符:m << n,表示把 m 左移 n 位。
在左移 n 位的时候,最左边的 n 位被丢弃,右边不上 n 个0。
比如:
00001010 << 2 = 00101000
10001010 << 3 = 01010000 - 右移:
运算符:m >> n,表示把 m 右移 n 位。
在右移 n 位的时候,最右边的 n 位被丢弃。但是如果数字是一个无符号数值,则用 0 填补最左边的 n 位;如果数字是一个有符号数值,则右移之后在最左边补 1.
比如:
00001010 >> 2 = 00000010(正数,左边补 0)
10001010 >> 3 = 11110001(负数,左边补 1)
题目:二进制中 1 的个数。实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把9表示成二进制是 1001,有 2 位是 1。
思路:
如果把一个整数 n 减去 1,都是把最右边的 1变成 0.如果右边还有 0,则所有 0 变成 1,而它所有位不变。
接下来把 n 和 n-1 做与运算,相当于把最右边的 1 变成 0。
如:
1100 减去 1 = 1011
1100 & 1011 = 1000
二进制中有几个 1 ,就要进行几次运算。
代码:
class Solution:
def NumberOf1(self, n):
count = 0
while n:
count = count + 1
n = (n - 1) & n
return count
s = Solution()
print(s.NumberOf1(9))