思路:
把一个整数和他减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 = 0if n < 0:n = n & 0xffffffff##是先把负数变成整数的表示方法?while n:count += 1#将整数与其减1后的数字做位于,能起到消掉最右边1的效果,循环后,如果整数不为0,那么一共有多少位为1,循环计数就为几n = (n-1)&nreturn 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 Trueelse:return False# 判断两个数的二进制表示有多少位不一样, 直接比较两个数的二进制异或就可以 如果是整数和负数比较的话要注意def andOr(self, m, n):#====================方法1-变相求整数的二进制表示法中1的个数==========================================================##10进制的整数(正数、负数)和0xffffffff都得到其正数的表示方法diff = (m&0xffffffff)^(n&0xffffffff)##给出的是10进制的表示,其二进制表示中1的个数就是不同的位数count = 0while diff:count += 1diff = diff&(diff-1)##紧接着判断是否满足return count#==============================================================================# return bin((m&0xffffffff)^(n&0xffffffff)).count('1')#方法2S = Solution()print(S.NumberOf1(-1))print(S.NumberOf2(-1))print(S.powerOf2(64))print(S.powerOf2(63))print(S.andOr(-1, 1))
附件列表
浙公网安备 33010602011771号