编程笔试题※python实现※位运算类

1.请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。(与运算)(剑指offer15题)
思路:与运算只有同为1才是1; 所以使用1,10,100…去循环与数字n做与运算,如果结果为true则计数器加1。知道循环的这个数字比n大。

n=int(input(""))
count=0
sum=1
while sum<=n:
    if sum & n:
        count+=1
    sum=sum<<1
print(count)

2.给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。(异或运算)
思路:根据异或运算的特点,相同的数字经过异或运算后结果为0,除单独出现一次的数字外,其他数字都是出现两次的,那么这些数字经过异或运算后结果一定是0。而任何数字与0进行异或运算都是该数字本身。所以对数组所有元素进行异或运算,运算结果就是题目的答案。

nums=[int(n) for n in input().split()]
num=0
for i in range(len(nums)):
    num=num^nums[i]
return num

3…给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
思路1:统计所有数字中每一位中1出现的总数,那么对于某一位,1出现的次数一定是3的倍数+1或0(3个0是0,3个1是1),那么对这个数%3得到的结果就是目标数字在该位上的值,将每一位的值组合即为所求。

lis = [None]*32
for i in range(32):
    lis[i]=0
for n in nums:
    r=1
    j=31
    while(j>=0):
        if((n&r)!=0):
            lis[j]+=1
        j-=1
        r=r<<1
r=1
j=31
teg=0
while(j>=0):
    if(lis[j]%3!=0):
       teg=teg^r
    r=r<<1
    j-=1
return teg

思路2:假如nums每个元素都刚好3次, 那么sum(nums) 应该是sum(set(nums))的3倍, 现在少的那个差就是因为元素X少出现了两次,所以X就是差除以2


思路3:排序

思路4:字典统计

4.IP地址转换为32位无符号整数
思路:用.分开成4个数。第一部分左移24位,第二部分左移16位,…将四部分结果相加。

s="10.0.3.193"
lis=[int(t) for t in s.split(".")]
sum=0
t=24
for i in range(len(lis)):
    item=lis[i]<<t
    sum+=item
    t-=8
print(sum)

变形:32位整数转IP地址。

def intToBin(n):
    b=[]
    while True:  # 一直循环,商为0时利用break退出循环
        y = n % 2  # 余数
        n = n // 2  # 商
        b = b + [y]  # 每一个余数存储到b中
        print(b)
        if n == 0:
            break  # 余数为0时结束循环
    b.reverse()  # 使b中的元素反向排列
    b = [str(i) for i in b]
    return ''.join(b)

num = 167773121
s = intToBin(num)
t1 = s[:8]
t2 = s[8:16]
t3 = s[16:24]
t4 = s[24:]
print(t1, t2, t3, t4)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值