在Python 3.6.8中右移32位返回错误值

时间:2019-04-22 21:06:35

标签: python python-3.x

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

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

1 个答案:

答案 0 :(得分:1)

好的,这是一个奇怪的情况。 board._current_player_board 的类型为 int,但已通过外部函数调用将其强制转换为numpy.int32。董事会对象使用的类定义位于一个甚至不导入numpy的文件中!

此处板对象的方法内有一行self._board |= self._board + (1 << 6 * move)。对该方法进行了调用,该方法传递了numpy.int32类型进行移动,这导致self._board转换为相同的类型,因此在移出32位时会出现问题。在将此值传递给该方法之前将其强制转换为int可以避免此问题。