标签:turn class 因此 == pre 注意 ffffff 位置 +=
题目描述class Solution:
def NumberOf1(self, n):
"""
给定一个数n,将n和(n-1)做位与运算可以将最后一个1变成0.
假设n的最后一个1在第m位,则将n-1之后,第m位由1->0,第m位以后的位全部取反,
第m位以前的位保持不变。因此我们得到一个结论:n & (n-1)可以将n的最后一个1变成0。
当给定的数字是正数的时候,我们可以直接按照上面的结论去计算二进制中1的个数。
但是如果给定的数字是复数的话,当n变成除了符号位,其它都为0的时候,n-1会保持符号位不变,
将其他位取反,导致循环无法终止。
考虑32位整数,如果是复数,符号位为1111,那么我需要将最高位符号位置为0来确保循环得到终止,
因此将n &= 0x7fffffff,并将num+=1,因为最高位符号位是1,已被我们置为0
"""
num = 0
# 将符号位置为0,注意这里num += 1
if n < 0:
n &= 0x7fffffff
num += 1
# n & (n-1)可以将n的最后一个1变成0
while n != 0: # 将一个数减去1
num += 1
n = (n - 1) & n
return num
def isPowOf2(self, n):
"""
给定一个整数n,判断是否是2的整数次幂
"""
if n <= 0:
return False
n &= n - 1 # 如果n是2的整数次幂,那么二进制中只有1个1,去掉之后n变为0
return n == 0
def binaryDistance(self, n, m):
"""
给定n和m,需要改变n的多少位才能得到m
"""
dist = n ^ m
num = 0
if dist < 0:
num += 1
dist &= 0x7fffffff
while dist != 0:
dist &= dist - 1
num += 1
return num
标签:turn class 因此 == pre 注意 ffffff 位置 +=
原文地址:https://blog.51cto.com/jayce1111/2381096