首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于使用逻辑运算符理解python函数

关于使用逻辑运算符理解python函数
EN

Stack Overflow用户
提问于 2016-08-14 06:16:33
回答 2查看 78关注 0票数 0

我曾经读过下面的python函数,

代码语言:javascript
运行
复制
def f1(i, num_digits):
    return np.array([i >> d & 1 for d in range(num_digits)])

我不太清楚i >> d & 1的这部分是如何工作的。运行f1(2,5)将返回[0,1,0,0,0]

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-14 06:40:59

此函数用于创建一个列表,其中包含向右移位index次数后的最后一位i

听起来很神秘?它是。

下面是发生的情况:

列表理解创建一个大小为num_digits-1的列表,使用范围表达式(从0到num_digits-1)的值来计算应该位于该列表索引处的项目的值。为了计算列表项的值,取整数i,并将其位右移d位,其中d是我们迭代构建列表的范围的当前值。>> (向右移位)运算符的优先级高于&运算符,因此首先执行此计算。计算列表值的最后一步是执行位移值和值1的逻辑&。这一步需要一些思考,但它所做的是返回位移值的最后一位。

如果你真的在一张纸上做这些步骤,这会更容易。请看,如果我们将2的位值向右移位一位(因此索引1处的列表条目是1,其余的是0),我们的计算的最后一位是1:

代码语言:javascript
运行
复制
Index 0: 2 (dec) = 10 (bin) -> >> 0 -> 10 (bin) -> 10 & 01 = 00 (bin) = 0 (dec)
Index 1: 2 (dec) = 10 (bin) -> >> 1 -> 01 (bin) -> 01 & 01 = 01 (bin) = 1 (dec)
Index 2: 2 (dec) = 10 (bin) -> >> 2 -> 00 (bin) -> 00 & 01 = 00 (bin) = 0 (dec)
# From here on it will be the same as index 2, because we are only shifting 0's

我希望这能帮助您理解正在发生的事情。

票数 0
EN

Stack Overflow用户

发布于 2016-08-14 07:18:49

numpy让我们在一个漂亮的表格中演示这一操作:

代码语言:javascript
运行
复制
In [1633]: np.arange(10)[:,None]>>np.arange(5)
Out[1633]: 
array([[0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [2, 1, 0, 0, 0],
       [3, 1, 0, 0, 0],
       [4, 2, 1, 0, 0],
       [5, 2, 1, 0, 0],
       [6, 3, 1, 0, 0],
       [7, 3, 1, 0, 0],
       [8, 4, 2, 1, 0],
       [9, 4, 2, 1, 0]], dtype=int32)

看起来& 1将其转换为二进制数字表示:

代码语言:javascript
运行
复制
In [1634]: np.arange(10)[:,None]>>np.arange(5) & 1
Out[1634]: 
array([[0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [1, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [1, 0, 1, 0, 0],
       [0, 1, 1, 0, 0],
       [1, 1, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [1, 0, 0, 1, 0]], dtype=int32)

比特移位实际上是被2的幂除

代码语言:javascript
运行
复制
In [1641]: np.arange(10)[:,None]//(2**np.arange(5))
Out[1641]: 
array([[0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [2, 1, 0, 0, 0],
       [3, 1, 0, 0, 0],
       [4, 2, 1, 0, 0],
       [5, 2, 1, 0, 0],
       [6, 3, 1, 0, 0],
       [7, 3, 1, 0, 0],
       [8, 4, 2, 1, 0],
       [9, 4, 2, 1, 0]], dtype=int32)

和模2的余数:

代码语言:javascript
运行
复制
In [1642]: np.arange(10)[:,None]//(2**np.arange(5)) % 2
Out[1642]: 
array([[0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [1, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [1, 0, 1, 0, 0],
       [0, 1, 1, 0, 0],
       [1, 1, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [1, 0, 0, 1, 0]], dtype=int32)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38937461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档