C语言中的逐位AND

时间:2017-05-27 16:33:06

标签: c decimal octal

考虑一下Dennis ritchie在C book中给出的以下陈述

  

按位AND运算符&通常用于掩盖某些位,

     

例如

n = n & 0177; 
     除了n的低位7位之外,

设置为零。

关于逐位AND运算符,我的理解如下

11010010& 01101010 = 01000010

,即如果任何操作数中的相应位为0

,则设置为0

但是在上面引用的语句中,除了最后一个7之外,它被告知这些位是0。

如果我们用二进制扩展0177,它将是10110001(8位),所以我们不能说低阶8位。哪里出错了?

3 个答案:

答案 0 :(得分:4)

您将掩码转换为177,就像它是十进制一样。但事实并非如此:前导零使其成为八进制常数。

因此,它的二进制表示是

01111111

正如你所看到的,除了较低的7之外,它会屏蔽所有位。

在过去,八进制表示法一直受到PDP计算机程序员的欢迎,因为它让他们阅读"二进制代码更容易。它现在不那么流行了,十六进制表示法在定义二进制掩码时大多取代它。

答案 1 :(得分:3)

在C整数中,前缀为0的是八进制(基数为8),因此0177 = 001 111 111 2

在八进制中,每个数字0-7恰好代表3个二进制数字。它有些神秘和古老,例如12个字长的日子并不少见(例如PDP8)。这是一个不幸的表现形式,因为它更频繁地发现了不经常的警察而不是作为数字表示法更有用。

我在写位字段时的建议是坚持十六进制(在这种情况下为0x7f),其中每个数字代表4个二进制数字,因此符合八个字长在现代建筑上。

如果您使用%i格式说明符进行输入,则会偶然发生另一个问题 - 这也会分别将00x前缀解释为八进制和十六进制,这可能会导致混淆错误数据源生成前导十进制零。

答案 2 :(得分:1)

引用C11,章节§6.4.4.1,(强调我的

  

[...]八进制常量由前缀0 组成,可选地后跟一个序列   数字07。 [...]

因此,0177之类的整数常量是八进制,与十进制127或十六进制7F相同。二进制表示为您提供01111111,这是

中的真实
  除了n的低位7位之外,

[...]设置为零。