按位“与”运算是否会在二进制表示形式前添加零?

kry*_*y23 5 python bit-manipulation cpython

当我使用按位与运算符( &) 与数字 1 来确定数字 x 是奇数还是偶数时(x & 1),解释器是否会根据 x 的二进制表示形式更改 1 的二进制表示形式?例如:

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

它是否会在 1 的二进制表示后追加 0 来执行按位与运算?

查看cpython 实现,看起来它是根据正确参数的大小来比较数字的。所以在这种情况下,上面的例子实际上是有效的:

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

我的理解对吗?我对Geeks for Geeks这张图片感到困惑。

Joh*_*ica 7

从概念上讲,向较短的数字添加零与忽略较长的数字中多余的数字具有相同的结果。他们都做同样的事情。然而,填充的效率很低,因此实际上您不想这样做。

原因是因为任何与 0 进行 AND 运算的结果都是 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;
}
Run Code Online (Sandbox Code Playgroud)

然后它迭代较小的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;
Run Code Online (Sandbox Code Playgroud)

所以我的理解是对的,图像只是为了直觉?

是的,正确。该图像用于概念理解。它并不反映它在代码中的实际实现方式。