1.位运算
- &(与)、| (或)、^(异或)、~ (非/取反)
- ">>“和”<<"运算符将二进制位进行右移或者左移操作
- ">>>"运算符将用0填充高位; >>运算符用符号位填充高位,没有<<<运算符
- 对于int型,1<<35与1<<3是相同 的,而左边的操作数是long型时需对右侧操作数模64
- 与:都为1结果为1,或:有一个为1结果为1,异或:二者不同时结果为1
题1:找出唯一的数
1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
解题:
1.先排序,从左到右遍历进行异或运算,利用A^A=0,0^A=A的性质解题。A^A^A=A,A^A=0。
2.累加求和,最后减去递增序列和求出重复元素。
3.开一个辅助空间记录数据出现数量,遍历得到等于2的数解决。
import random
list1 = [ i for i in range(10)]
print(list1)
num = random.randint(0,9)
list1[1]=num
list1.sort()
print(list1)
temp=0
for i in range(len(list1)-1):
temp=temp^i
for i in range(len(list1)-1):
temp=temp^list1[i]
print(temp)
题2:找出落单的那个数(与题1类似)
一个数组里除了某一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。
题3:二进制中1的个数
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
例: 9的二进制表示为1001,有2位是1
解题:
1.(x-1)&x消掉最低位的1
2.比对每一位
3.转为二进制,用字符串的count计数方法
# 解法一
n=7
count = 0
while(n!=0):
n=(n-1)&n
count+=1
print(count)
# 解法二
n=7
count = 0
for i in range(32):
if((n&1<<i)==1<<i):
count+=1
print(count)
# 解法三
n=7
temp = str(bin(n))
count = temp.count('1')
print(count)
题4:是不是2的整数次方
解题:即二进制中只有一个1
n=16
if(((n-1)&n)==0):
print("Yes")
else:
print("No")
题5:将整数的二进制奇偶位互换
解题:和1010与运算得到偶数位,和0101与运算得到奇数位,偶数位右移,奇数位左移,在异或操作便实现互换。
def m(i):
ou = i&0xaaaaaaaa # 和1010 1010 ...做与运算得到偶位
ji = i&0x55555555 # 和0101 0101 ...做与运算得到奇位
return (ou >> 1) ^ (ji << 1) # 异或和或运算都可以
a = 6
print(m(a))
题6:0~1间浮点实数的二进制表示
给定一个介于0和1之间的实数, (如0.625) ,类型为double,打印它的二进制表示(0.101,因为小数点后的二进制分别表示0.5,0.25.0.12…)。
如果该数字无法精确地用32位以内的-进制表示,则打印“ERROR”
解题:小数×2,判断是否大于1,大于1则二进制取1并减1。
list1=[]
a = 0.625
while(a>0):
a=a*2
if(a>=1):
list1.append('1')
a=a-1
else:
list1.append('0')
if(len(list1)>32):
print("error!")
print(''.join(list1))
题7:出现k次与出现1次
数组中只有-一个数出现了1次,其他的数都出现了k次,请输出只出现了1次的数。
2 个相同的2 进制数做不进位加法,结果为0
10个相同的10进制数做不进位加法,结果为0
k 个相同的k 进制数做不进位加法,结果为0