位运算的有趣用法

请看下面这个函数

conditional = lambda x,y,z : ((~(not not x)+1)&y) + ((~(not not not x)+1)&z)

这是一个匿名函数,看起来可能觉得怪怪的,但让我们看一下他的输出结果就马上能发现一个神奇的东西(不好意思手滑,多打了一个conditional这里)

聪明的你肯定已经发现了,这其实是一个三元运算,等价于下面的代码

conditional_ = lambda x,y,z: y if x else z

让我们看看这究竟是怎么做到的。

'''
假设数字是用8位表示,即可以表示-128 到 127的数字,python用bin函数可以将十进制转化为二进制
a = 1 二进制 00000001
b = 0 二进制 00000000
c = -1 二进制 11111111
~ : 取反操作符,即按位取反,0变为1,1变为0
~a : 11111110
~b : 11111111
~c : 00000000

~a + 1 : 11111111 即为十进制的-1,这里其实是补码表示负数的缘故,在计算机中负数用补码表示,而补码正好等于反码加一,所以对一个数取反加一就会变成这个数的负数
~b + 1 : 11111111 + 1,会导致溢出,所以最后还是只剩 00000000,即0


& : 与操作符
1 & 0 = 0
0 & 1 = 0
1 & 1 = 1
0 & 0 = 0
由于0的所有位都是0,所以0 与上任何数,结果都为0,而 -1 与上任何数,都等于那个数
即 x & 0 = 0 , x & -1 =  x
所以我们为了达成当 x = 1 (即x为真),为y,当x=0的时候为z,这里有个巧妙地地方,用的加法,下面请看
'''
conditional = lambda x,y,z : ((~(not not x)+1)&y) + ((~(not not not x)+1)&z)

not not x #因为在python中,表示true的时候不一定为整数,所以先把x 转为 True 或者 False,即 1或者 0
not not not x # 同理

~(not not x) + 1 ,# 当x为真的时候结果为-1,而 -1 &上任何数都为原数,所以与上y,
~(not not not x) + 1 #当x为真的时候结果为0,0 &上任何数都为0,两者一项加就会变成y + 0,所以就是y

读者如果感兴趣,可以自己分析一下当x为假的时候

本次的分享就到这里啦,下次再见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值