在 K&R 的 ANSI C 第 49 页,作者说
x = x & ~077
sets the last six bit ofx
to zero. Note thatx & ~077
is independent of word length, and it thus preferable to, for example,x & 0177700
, which assumes thatx
is a 16 bit quantity.
我的问题是,为什么作者将 x 视为 16 位数量,而 0177700 总共是 21 位?当我从 0177700(例如:177700)计算位数时,我应该忽略第一个 0 位吗?
其次,文章是否说使用 ~077
更灵活和有用,因为它可以应用于任何 x
值,而不管其大小?
最佳答案
如果将这些八进制转换为二进制,应该更容易可视化:
077:
0011 1111
~077:
1100 0000
0177700:
1111 1111 1100 0000
why the authors consider the x as 16 bit quantity whereas 0177700 is total of 21 bit?
正如您在上面看到的那样,事实并非如此。 0177700实际上占16位。
is the passage saying that using ~077 is more flexible and useful as it can be applied to any x values regardless of its size?
没错。如果您认为字节是处理的最小可能单位,则 077 (~077
) 的按位非表示包含最后六位设置为 0 和其余位(只有两个)的最小可能数设置为一。如果要将任意字的最后 6 位设置为 0,则需要将其与符合此描述的内容进行 AND(最后 6 位设置为 0,其他设置为 1)。 ~077
是最合适的,因为它是包含这些要求的最小可能。
如果您将其与 0177700,则您假设该字至少有 16 位长。
这在很大程度上是基于您不能 AND 两种不同尺寸这一事实。使用 ~077
,并考虑到这一点:
x & ~077
如果 x
的类型大于 077,比如说 16 位,则 077 将首先通过用零填充来“提升”:
0000 0000 0011 1111
然后反转生成想要的
1111 1111 1100 0000
如果你使用 0177700,如果 x
是 8 位长,你就有问题了。这就是为什么他们说您会假设 x
是 16 位长。换句话说,~077
是最小且最适合将最后六位设置为 0 的作业。
类似地,使用 0300(已解析为 ~077
)您会假设 x
是 8 位。失去类型提升在 ~077
中提供的灵 active 。
关于c - 来自 ANSI C K&R 的位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51198325/