正确的Bitshift by 32在Python 3.6.8中返回不正确的值

问题描述 投票:0回答:1

当向右移位变量32位时,返回变量本身而不是正确的结果(在这种情况下为零)。此外,超过32的任何内容都会将原始位移返回32-x位。这与存储的变量一起发生,但是当在命令中使用整数本身而不是变量时不会发生这种情况。我尝试将object属性保存到局部变量并使用相同的奇怪结果执行操作。有任何想法吗?

board._current_player_board
Out[103]: 16777217
board._current_player_board >> 32
Out[104]: 16777217
16777217 >> 32
Out[105]: 0
board._current_player_board >> 31
Out[106]: 0
board._current_player_board >> 33
Out[107]: 8388608
16777217 >> 33
Out[108]: 0
16777217 >> 31
Out[109]: 0
board._current_player_board >> 34
Out[110]: 4194304
python python-3.x
1个回答
1
投票

好的,这是一个奇怪的边缘情况。 board._current_player_board的类型是int,但是它被外部函数调用强制转换为numpy.int32。 Board对象使用的类定义是在一个甚至没有导入numpy的文件中!

这里有一个板对象的方法里面有一行self._board |= self._board + (1 << 6 * move)。对此方法进行了调用,该方法为移动传递了numpy.int32类型,这导致self._board被转换为相同的类型,因此当移位超过32位时出现问题。在将此值传递给该方法之前将此值转换为int可防止此问题。

© www.soinside.com 2019 - 2024. All rights reserved.