【算法学习】 位运算中的奇巧淫记

				 蓝桥杯算法学习打卡

算法中的位运算

1.找出数组中唯一成对的那个数

2.二进制中1的个数

3.一条语句判断整数是不是2的整数次方

4.将整数的奇偶位互换

5.二进制表示浮点实数


1.找出数组中唯一成对的那个数

题目描述:在这里插入图片描述
分析

异或运算中,存在以下规则
x^x=0
x^0=x
自反性:A^A^B=0^B=B #连续和同一个因子异或,结果为自己

1001个数中有999个数只出现了一次,有1个数出现了两次,此题我们可以采用异或的知识
实现

import random
N=1001
x=0
index=1
my_list=[int(i) for i in range(1,1001)] #生成一个列表,包含1-1000
n=random.randint(1,N)                   #随机生成一个1-1000的数,加入列表
my_list.append(n)
for i in range(1,N):   #先用x=0去异或1-1000
    x=x^index
    index+=1
for i in my_list:      #再用x去异或列表的每个元素(1-1000和那个重复的数)
    x=x^i
#经过上述步骤列表中唯一的数被异或了两次结果为0,而唯二的数被异或了三次x^x^x=x

#print(my_list)    输出列表,可查看x的值等于列表末尾的元素
print(x)


2.二进制中1的个数

题目描述:
在这里插入图片描述
分析:

9来说
 1 0 0 1
-      1
----------
 1 0 0 0
(1001)&(1000)=1000  

 1 0 0 0
 -     1
 ----------
 0 1 1 1
 (1000)&(0111)=0000
 #每次操作 n&(n-1) 的意义为消去二进制表示中最低位的一个1
 #直到结果为0,二进制中的1则全部消去

代码:

n=int(input())
i=0
while n!=0:
    n=(n-1)&n
    i+=1
print(i)

#常规方法2
#10进制转2进制 bin()   10进制转8进制 oct()   10进制转16进制 hex()
m=int(input())
s=bin(m)
print(s)
print(s[2:].count("1"))


3.一条语句判断整数是不是2的整数次方

题目描述:
输入一个数,判断是不是2的整数次方

分析:

2的整数次方,例如0248163264等
这些数的共同点就是他们的二进制表示中仅有一位是1,其他位全为0
此题可借用上题的方法

代码

n=int(input())
if n&(n-1)==0:
    print("yes")
else:
    print("no")

4.将整数二进制表示的奇偶位互换

分析:
在这里插入图片描述
代码:

n=int(input())
ou=n&int('10101010',2)
ji=n&int('01010101',2)
print((ou>>1)^(ji<<1))

5.二进制表示浮点实数

题目:
在这里插入图片描述

分析:

此题是一个定式
拿0.625举例,配合着代码理解
0.625*2  =1.25   1.25大于1 在s后面接上1 返回1.25-1=0.25
0.25*2   =0.5    0.5小于1  在s后面接上0 返回0.5
0.5*2    =1      1等于0    在s后面接上1 返回1-1=0
结束

代码:

s="0."
#输入小于1的小数
n=float(input())
while n>0:
    r=n*2
    if r>=1:
        s+="1"
        n=r-1
    else:
        s+="0"
        n=r
   # if len(s)>34:
   #    print("error")
print(s)

注:文中题目及思路均来自蓝桥算法课,本文只是整理吸收,侵删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

turboSniper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值