C 按位运算符示例
C Bitwise Operators Example
给定以下函数:
int boof(int n) {
return n + ~n + 1;
}
这个功能是什么return?我无法准确理解传递给它的内容。如果我调用 boof(10),它会将 10 转换为基数 2,然后对二进制数进行按位运算吗?
这是我最近做的一道题,我认为答案应该是0,但我不确定如何证明。
注意:我知道每个按位运算符是如何工作的,但我对输入的处理方式更加困惑。
谢谢!
按位运算不会将数字的基础表示更改为基数 2 - CPU 上的所有数学运算无论如何都是使用二进制运算完成的。
这个函数所做的是取 n,然后将其添加到自身的二进制补码负表示中。这基本上否定了输入。您输入的任何内容都将等于 0。
让我用 8 位数字来解释,因为这更容易形象化。
10 在二进制中表示为 00001010。
负数存储在补码中(记数加1)
所以 10 的 (~n + 1) 部分看起来像这样:
11110101 + 1 = 11110110
所以如果我们取 n + ~n+1:
00001010 + 11110110 = 0
注意,如果我们将这些数字加在一起,我们会得到一个左进位,这将设置溢出标志,结果为 0。(将负数和正数加在一起绝不意味着溢出表示异常!)
当 n
是 int
时,n + ~n
将始终导致所有位都已设置的 int
。
严格来说,向这样的 int
加 1 的行为将取决于平台上符号数的表示。 C 标准支持 signed int
的 3 种表示形式:
对于二进制补码机(当今使用的绝大多数系统),结果将为 0,因为所有位设置的 int
为 -1。
在 One's Complement 机器上(我相信这在今天非常罕见),结果将为 1,因为 int
所有位设置为 0 或 -0(负零) ) 或未定义的行为。
a 有符号幅度机器(真的有这些机器还在使用吗?),一个设置了所有位的 int
是一个具有最大幅度的负数(所以实际值将取决于 int
) 的大小。在这种情况下,将其加 1 将得到一个负数(确切的值,同样取决于用于表示 int
的位数)。
请注意,以上内容忽略了某些实现可能会陷入 n + ~n
.
可能出现的各种位配置的情况
给定以下函数:
int boof(int n) {
return n + ~n + 1;
}
这个功能是什么return?我无法准确理解传递给它的内容。如果我调用 boof(10),它会将 10 转换为基数 2,然后对二进制数进行按位运算吗?
这是我最近做的一道题,我认为答案应该是0,但我不确定如何证明。
注意:我知道每个按位运算符是如何工作的,但我对输入的处理方式更加困惑。
谢谢!
按位运算不会将数字的基础表示更改为基数 2 - CPU 上的所有数学运算无论如何都是使用二进制运算完成的。
这个函数所做的是取 n,然后将其添加到自身的二进制补码负表示中。这基本上否定了输入。您输入的任何内容都将等于 0。
让我用 8 位数字来解释,因为这更容易形象化。
10 在二进制中表示为 00001010。
负数存储在补码中(记数加1)
所以 10 的 (~n + 1) 部分看起来像这样:
11110101 + 1 = 11110110
所以如果我们取 n + ~n+1:
00001010 + 11110110 = 0
注意,如果我们将这些数字加在一起,我们会得到一个左进位,这将设置溢出标志,结果为 0。(将负数和正数加在一起绝不意味着溢出表示异常!)
当 n
是 int
时,n + ~n
将始终导致所有位都已设置的 int
。
严格来说,向这样的 int
加 1 的行为将取决于平台上符号数的表示。 C 标准支持 signed int
的 3 种表示形式:
对于二进制补码机(当今使用的绝大多数系统),结果将为 0,因为所有位设置的
int
为 -1。在 One's Complement 机器上(我相信这在今天非常罕见),结果将为 1,因为
int
所有位设置为 0 或 -0(负零) ) 或未定义的行为。a 有符号幅度机器(真的有这些机器还在使用吗?),一个设置了所有位的
int
是一个具有最大幅度的负数(所以实际值将取决于int
) 的大小。在这种情况下,将其加 1 将得到一个负数(确切的值,同样取决于用于表示int
的位数)。
请注意,以上内容忽略了某些实现可能会陷入 n + ~n
.