思路:
把一个整数和他减1后的数做位于运算,得到的结果(以10进制的整数给出)相当于把原整数的二进制表示中最右端的1变为0,很多问题都可以这么解决。
-
2的幂 乘2 除2 2的幂指数次放都可以转化为该数的二进制表示方法 左移 右移 二进制中1的个数
-
把整数右移 左移 1位和把整数除2在数学上是一样的,但是除法的效率比移位要低得多,因此实际编程中要尽量多的用移位代替除法。
-
如果是负数移位,因为移位前是个负数,因此保证移位后也要是个负数,所以最高位设为1,如果一直做移位运算,则最后会变成0xffffffff从而变成死循环
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 23 15:17:01 2017
@author: zzpp220
"""
#========除法操作效率低,应换成相应的移位操作,再者,下面的方法输入如果是负数就引起死循环===============================================
#def int2Binary(number):
# rest_Set=[]
# while number!=0:
# rest=number%2
# rest_Set.insert(0,rest)
# number=number>>1##除2和右移1位相同
# return rest_Set.count(1)
#==============================================================================
'''
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
'''
class Solution:
def NumberOf1(self, n):
count = 0
if n < 0:
n = n & 0xffffffff##是先把负数变成整数的表示方法?
while n:
count += 1
#将整数与其减1后的数字做位于,能起到消掉最右边1的效果,循环后,如果整数不为0,那么一共有多少位为1,循环计数就为几
n = (n-1)&n
return count
#==============================================================================
# '''
#(-1&0xffffffff)= 4294967295--正数与0xffffffff位与运算最后返回的是10进制的正数形式
# bin(-1& 0xffffffff)='0b11111111111111111111111111111111'--转化为2进制
#
# type(bin(-1& 0xffffffff))=str
#
# bin(-1& 0xffffffff).count('1')=32
# bin(-32& 0xffffffff).count('1')=27'''
#==============================================================================
def NumberOf2(self, n):
##先得到负数的二进制表示,其实0xffffffff就是-1,所有的负数和-1的二进制做位与,得到其二进制表示
return bin(n & 0xffffffff).count('1') if n <0 else bin(n).count('1')
# 判断一个数是不是2得整数次幂
def powerOf2(self, n):
if n&(n-1) == 0:##2的幂 乘2 除2 2的幂指数次放都可以转化为该数的二进制表示方法 左移 右移 二进制中1的个数
return True
else:
return False
# 判断两个数的二进制表示有多少位不一样, 直接比较两个数的二进制异或就可以 如果是整数和负数比较的话要注意
def andOr(self, m, n):
#====================方法1-变相求整数的二进制表示法中1的个数==========================================================
##10进制的整数(正数、负数)和0xffffffff都得到其正数的表示方法
diff = (m&0xffffffff)^(n&0xffffffff)##给出的是10进制的表示,其二进制表示中1的个数就是不同的位数
count = 0
while diff:
count += 1
diff = diff&(diff-1)##紧接着判断是否满足
return count
#==============================================================================
# return bin((m&0xffffffff)^(n&0xffffffff)).count('1')#方法2
S = Solution()
print(S.NumberOf1(-1))
print(S.NumberOf2(-1))
print(S.powerOf2(64))
print(S.powerOf2(63))
print(S.andOr(-1, 1))