ANSI C K&;中的位运算符;R

ANSI C K&;中的位运算符;R,c,C,在K&R的ANSI C第49页中,作者说 x=x&~077 将x的最后六位设置为零。请注意,x&~077与字长无关,因此它比例如x&0177700更可取,后者假定x为16位量 我的问题是,为什么作者认为x是16位,而0177700是21位?当我从0177700(例如177700)开始计算位数时,是否应该忽略前0位 其次,这篇文章是否说使用~077更灵活、更有用,因为它可以应用于任何x值,而不管其大小 八进制文字中的前导0不应计数,这只是语法的一部分(无论如何,前导零不应计数)0177700适合1

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

x=x&~077
x
的最后六位设置为零。请注意,
x&~077
与字长无关,因此它比例如
x&0177700
更可取,后者假定
x
为16位量

我的问题是,为什么作者认为x是16位,而0177700是21位?当我从0177700(例如177700)开始计算位数时,是否应该忽略前0位


其次,这篇文章是否说使用
~077
更灵活、更有用,因为它可以应用于任何
x
值,而不管其大小

八进制文字中的前导
0
不应计数,这只是语法的一部分(无论如何,前导零不应计数)
0177700
适合16位,因为最有效的八进制数字是1。该值等于
0xffc0
,这显然是一个16位的值

是的,使用倒置的小文本稍微灵活一些,因为它在文本中编码的信息较少

如果要清除整数的最低位,请执行以下操作

x &= ~1u;
更灵活,因为它在具有16位整数的平台上的工作方式与在32位平台上的工作方式相同,但更明确

x &= 0xfffeu;

不会,因为它假定为16位,并且不为16位到31位提供掩码位,如果它们存在的话。

八进制文本中的前导
0
不应计数,这只是语法的一部分(无论如何,前导零不应计数)
0177700
适合16位,因为最有效的八进制数字是1。该值等于
0xffc0
,这显然是一个16位的值

是的,使用倒置的小文本稍微灵活一些,因为它在文本中编码的信息较少

如果要清除整数的最低位,请执行以下操作

x &= ~1u;
更灵活,因为它在具有16位整数的平台上的工作方式与在32位平台上的工作方式相同,但更明确

x &= 0xfffeu;

不会,因为它假定为16位,并且不为16位到31位提供掩蔽位,如果它们存在的话。

如果将这些八进制转换为二进制,应该更容易可视化:

077:
0011 1111
~077:
1100 0000
0177700:
1111 1111 1100 0000
为什么作者认为x为16位,而0177700为21位?

正如你在上面看到的那样,情况并非如此。0177700实际上需要16位

文章是否说使用~077更灵活、更有用,因为它可以应用于任何x值,而不管其大小

没错。如果你认为一个字节是处理的最小可能单位,则位077的(077×< < /代码>)表示包含最后六位的最小可能数,设置为0,剩下的数(只有两个)设置为1。如果要将任意单词的最后6位设置为0,则需要使用符合此描述的内容(最后6位设置为0,其他6位设置为1)。而
~077
是最合适的配合,是包含这些要求的最小可能

如果您愿意并将其设置为0177700,则假定该单词至少有16位长

这在很大程度上是基于这样一个事实,即您不能使用两种不同的尺寸。使用
~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

中提供的灵活性,如果将这些八进制转换为二进制,则应该更容易可视化:

077:
0011 1111
~077:
1100 0000
0177700:
1111 1111 1100 0000
为什么作者认为x为16位,而0177700为21位?

正如你在上面看到的那样,情况并非如此。0177700实际上需要16位

文章是否说使用~077更灵活、更有用,因为它可以应用于任何x值,而不管其大小

没错。如果你认为一个字节是处理的最小可能单位,则位077的(077×< < /代码>)表示包含最后六位的最小可能数,设置为0,剩下的数(只有两个)设置为1。如果要将任意单词的最后6位设置为0,则需要使用符合此描述的内容(最后6位设置为0,其他6位设置为1)。而
~077
是最合适的配合,是包含这些要求的最小可能

如果您愿意并将其设置为0177700,则假定该单词至少有16位长

这在很大程度上是基于这样一个事实,即您不能使用两种不同的尺寸。使用
~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

中所提供的灵活性
x
是什么类型?这意味着使用
0177700
会使