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