【问题标题】:How is this bitwise AND operator masking the lower seven order bits of the number?这个按位与运算符如何屏蔽数字的低七位?
【发布时间】:2023-03-28 22:27:02
【问题描述】:

我正在阅读 Brian Kernigan 和 Dennis Ritchie 的C 编程语言。下面是关于按位 AND 运算符的说明:

按位与运算符& 通常用于屏蔽某些位集,例如,

    n = n & 0177 

n 的低 7 位之外的所有位都设置为零。

我不太明白它是如何屏蔽n 的低七位的。请问有人能解释一下吗?

【问题讨论】:

  • 0177 是八进制
  • 八进制已经过时了,今天你会使用0x7f

标签: c bit-manipulation bit bitwise-operators


【解决方案1】:

数字0177 是一个八进制数字,代表下面的二进制模式:

0000000001111111

当你AND它使用​​按位运算&时,结果只保留“掩码”中设置为1的位中的原始位;所有其他位变为零。这是因为“AND”遵循这个规则:

X & 0 -> 0 for any value of X
X & 1 -> X for any value of X

例如,如果你 AND 01770545454,你会得到

0000000001111111 -- 0000177
0101010101010101 -- 0545454
----------------    -------
0000000001010101 -- 0000154

【讨论】:

    【解决方案2】:

    在 C 中,以 0 为前缀的整数文字是八进制数,因此 0177 是八进制数。

    每个八进制数字(值 07)用 3 位表示,7 是每个数字的最大值。所以八进制的7 值意味着3 位已设置。

    【讨论】:

      【解决方案3】:

      由于0177 是一个八进制文字,并且每个八进制数是3 您拥有的三位,因此以下二进制等效项:

      7  = 111
      1  = 001
      

      这意味着0177 在二进制中是001111111

      【讨论】:

        【解决方案4】:

        前面已经解释过,第一个'0' 用于ANSI C 中数字的八进制表示。实际上,数字0177(八进制)与127(十进制)相同,即128-1,也可以表示为@ 987654321@和2^n-1在二进制表示中表示取n个1并将所有1放在右边。

        0177 = 127 = 128-1

        这是一个位掩码

        00000000000000000000000001111111

        您可以查看下面的代码;

        演示

        #include <stdio.h>
        
        int main()
        {
            int n = 0177;   // octal representation of 127
            printf("Decimal:[%d] : Octal:[%o]\n", n, n, n);
        
            n = 127;        // decimal representation of 127
            printf("Decimal:[%d] : Octal:[%o]\n", n, n, n);
        
            return 0;
        }
        

        输出

        Decimal:[127] : Octal:[177]
        Decimal:[127] : Octal:[177]
        

        【讨论】:

          【解决方案5】:

          0177 是一个八进制值,每个数字由 3 位表示,从值 000 到 111,因此 0177 转换为 001111111(即 001|111|111),如果您考虑 32 位二进制(也可以是 64 位,除了其余数字根据 MSB 填充,即在这种情况下的符号位值 0) 形式为 0000000000000000000000001111111 并对给定数字执行按位运算,将输出数字的低 7 位n 位数为 0。

          (since x&0 =0 & x&1=x e.g 0&0=0 ,1&0=0, 1&1=1 0&1=1)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-07-02
            • 2012-09-06
            • 1970-01-01
            • 1970-01-01
            • 2018-03-25
            • 1970-01-01
            • 2011-03-26
            相关资源
            最近更新 更多