按位“与”操作是否会在二进制表示中加入前导零?

5

当我使用按位与运算符(&)和数字1来判断一个数x是奇数还是偶数(x & 1)时,解释器是否会根据x的二进制表示改变数字1的二进制表示?例如:

  • 2 & 1 -> 10 & 01 -> 然后执行按位比较
  • 5 & 1 -> 101 & 001 -> 然后执行按位比较
  • 100 & 1 -> 1100100 & 0000001 -> 然后执行按位比较

它是否会在数字1的二进制表示中添加零以执行按位与操作?

查看cpython实现,它似乎根据右侧参数的大小比较数字。因此,在这种情况下,上面的例子实际上是有效的:

  • 2 & 1 -> 10 & 1 -> 0 & 1 -> 然后进行按位比较
  • 5 & 1 -> 101 & 1 -> 1 & 1 -> 然后进行按位比较
  • 100 & 1 -> 1100100 & 1 -> 0 & 1 -> 然后进行按位比较

我的理解正确吗?我有点困惑,因为来自Geeks for Geeksthis image


7
这有点像在纸上进行算术运算时,当你做234 + 1时是否需要在数字1后面添加更多的零,使其变成234 + 001。答案是,如果这样做让你感觉更好,你可以假装那些零存在,但它们不必出现在操作中才能有意义;你书写数字的方式并不等同于数字本身。 - kaya3
2
在二进制中,10000001 是相同的,前导零不会改变二进制位所表示的实际值。因此,您展示的Cython计算并不完全符合您描述的 5&1-> 101&1-> 1&1。实际上应该是 5&1-> 101&001-> 001-> 1。但这是相同的东西。 - Akshay Sehgal
2
数字序列“1”的顺序与数字序列“001”的顺序不同,但是这两个数字序列所代表的数字是相同的,尽管它们是不同的书写方式。因此,从概念上讲,数字序列是一件不同的事情,而数字本身则是另一件事情。 - kaya3
2
它不会添加任何内容,这就是重点。两个计算结果相同,但是在理解其工作原理时,您可以通过前导零更好地阅读这些内容。 - Akshay Sehgal
1
停下来思考一下,如果数字不按照这种方式工作,世界会变成什么样子可能会有所帮助。你不希望 100 + 1 变成 200,因此需要将数字处理为与零填充相同的方式。这并不意味着你要将 1 改为 001,它只是表示 1 就是 1,无论与它一起使用的其他操作数是什么。 - Charles Duffy
显示剩余5条评论
1个回答

7

从概念上讲,在较短的数字前面添加零与忽略较长数字中的多余位得到的结果相同。它们都是做同样的事情。但填充是低效的,所以在实践中你不想这样做。

原因是因为任何和0相与的东西都是0。如果你将短数字填充到与较长数字匹配,然后对额外的位进行AND运算,它们都将得出0。这个方法行得通,但由于你知道填充位只会产生额外的零,所以忽略它们并只迭代较短数字的长度更有效率。

Python只处理重叠的数字。首先,它有条件地交换ab以确保b是较小的数字:

/* Swap a and b if necessary to ensure size_a >= size_b. */
if (size_a < size_b) {
    z = a; a = b; b = z;
    size_z = size_a; size_a = size_b; size_b = size_z;
    negz = nega; nega = negb; negb = negz;
}

然后它迭代较小的size_b

/* Compute digits for overlap of a and b. */
switch(op) {
case '&':
    for (i = 0; i < size_b; ++i)
        z->ob_digit[i] = a->ob_digit[i] & b->ob_digit[i];
    break;

所以我的理解是正确的,这个图像只是为了直观感受吗?
是的,正确。这个图像是为了概念上的理解,它并不反映在代码中实际的实现方式。

最好解释一下Python的“digits”。 - Kelly Bundy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接