Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中访问二进制数的元素_Python_Python 3.x - Fatal编程技术网

在python中访问二进制数的元素

在python中访问二进制数的元素,python,python-3.x,Python,Python 3.x,给定这样一个二进制数,我想访问每个数字。 例如,我使用以下代码访问第三个元素 bin(125)# '0b1111101' bin(125)[::-1][3] 是的,它起作用了。但我不确定这是不是一个好办法。这看起来很危险,我想知道还有其他更好的方法来访问二进制数的每个元素。如果您懒惰,请格式化字符串: f'{125:b}'[::-1] # python 3.6+ formatted string literal # '1011111' # otherwise str.format() '{

给定这样一个二进制数,我想访问每个数字。 例如,我使用以下代码访问第三个元素

bin(125)# '0b1111101'
bin(125)[::-1][3]

是的,它起作用了。但我不确定这是不是一个好办法。这看起来很危险,我想知道还有其他更好的方法来访问二进制数的每个元素。

如果您懒惰,请格式化字符串:

f'{125:b}'[::-1] # python 3.6+ formatted string literal
# '1011111'

# otherwise str.format()

'{:b}'.format(125)[::-1]
# '1011111'
然后索引你想要的位


如果不是这样,您总是可以像在C/C++中一样进行位移位和掩码。取决于您看到操作发生的频率,或者可读性。但一旦它被字符串化和记忆化,无论如何它都是O(1)访问。此外,使用结尾处的“0b”也不再危险。

您的解决方案并不是真正的“危险”,但通常有一种更好的方法来访问数字的第n个二进制数字(在大多数语言中,这应该是一种额外功能):按位操作

解决方案(Python) 您可以使用以下代码访问具有索引
n
(最右边的数字具有索引
0
)的任意数字
num
的二进制数字:

digit = (num & (1 << n)) >> n
上面的“filter”值是一个数字,我们使用要检查的二进制数字的知识来构建它。因为我们想要索引4处的数字,所以我们使用一个由所有0组成的数字,除了第4位的1(同样,从右边开始计数,从0开始)

因为我们的过滤值在第四个位置只有一个1,所以我们知道除了第四个位置之外,我们的结果在每个位置都有0。第四个位置可以是0或1,具体取决于其他数字

这在纸上是很好的,但是我们如何根据索引获得过滤值呢?为此,我们使用另一种按位操作:左移位


使用
构造一个过滤器这看起来很“危险”?你可以移动并屏蔽:
[(125>>x)&1对x进行反转(范围(7))
=>
[1,1,1,1,1,0,1]
并使用
int.bit_length()
这样你就有了一个简单的计数方法。这很危险,因为用这种方法Python会在开始时去掉多余的0。该示例只有7位,因此访问位7将返回
b
。当bin字符串中的字符数少于8时,情况会变得更糟,然后你会得到一个索引器。你说你想访问每个数字。做什么,总的来说?无论如何,你可能不应该那样访问它们。 1 1 0 0 1 1 (51 in binary) & 0 1 0 0 0 0 (filter value - see below) ------------- 0 1 0 0 0 0 (result) 1 (binary) << 4 (decimal) --------- 1 0 0 0 0 (binary) 0 1 0 0 0 0 (binary) >> 4 (decimal) -------------- 0 1 (binary) 1 (discard leading 0s)
filter = 1 << n
result = num & filter
digit = result >> n