c - 来自 ANSI C K&R 的位运算符

标签 c

在 K&R 的 ANSI C 第 49 页,作者说

x = x & ~077 sets the last six bit of x to zero. Note that x & ~077 is independent of word length, and it thus preferable to, for example, x & 0177700, which assumes that x 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/

相关文章:

python - Cython 的新手......似乎无法正确包装枚举

c - Linux 中的 gdb7.7.1。当我尝试运行 gdb 时出现 "no debugging symbols found"

c++ - 使用 swscale 进行图像合成

c - 如何将用 C 编写的 block 传递给 Ruby 的 rb_mod_refine?

c - 文件 I/O fopen() 返回 NULL

c - 使结构在库和应用程序中都可见 - C

c - pthread_join 在两个无限循环线程上?

c - `N.0 == N && (int)N.0 == N` 是否为真,其中 `N` 是 int 范围内的整数文字?

c - 远离循环

c - 在 C 中初始化数组 - 执行时间