005:编程填空:左边i位取反(解析)

总时间限制: 1000ms 内存限制: 1024kB
描述
写出函数中缺失的部分,使得函数返回值为一个整数,该整数的左边i位是n的左边i位取反,其余位和n相同
请使用【一行代码】补全bitManipulation3函数使得程序能达到上述的功能

#include
using namespace std;
int bitManipulation3(int n, int i) {
// 在此处补充你的代码
}
int main() {
int t, n, i;
cin >> t;
while (t–) {
cin >> n >> i;
cout << bitManipulation3(n, i) << endl;
}
return 0;
}

输入
第一行是整数 t,表示测试组数。
每组测试数据包含一行,是两个整数 n 和 i (1<=i<=32)。
输出
对每组输入数据,输出整型变量n中左边i位取反的结果。
样例输入

1
0 32

样例输出

-1

提示
注意i从1开始

解析

题目中说到,“该整数的左边i位是n的左边i位取反”,对于这句话刚开始我不是很理解,左边i位到底是左边i个数值还是左边第i个呢?后来看到一些解答,发现是第i位取反,而且符号也要变,这样感觉题目有点含糊,讲的不太明确。所以,目标有两点:1、对左边第i位取反;2、要注意最高位符号也要变。
这样下来,左边第i位可以通过32-i的方式得到,因为正常情况下都是从右向左计算位,最高位符号的问题,直接使用-1就可以解决,因此需要补充的代码是

return n^(-1<<(32-i));//或者n^(~0<<(32-i)),实际上效果一样

对0进行位取反~0的过程:
0: 0000 0000 0000 0000 0000 0000 0000 0000
取反:1111 1111 1111 1111 1111 1111 1111 1111
此时为机器码,
由机器码求真值可以通过两种方式:
1、机器码对应的反码为 [机器码-1],也就是1111 1111 1111 1111 1111 1111 1111 1110
对应的原码也就是1000 0000 0000 0000 0000 0000 0000 0001
对应的真值也就是-1
2、除最高位,其余各位对机器码直接取反加1,1000 0000 0000 0000 0000 0000 0000 0000最后一位加1为1000 0000 0000 0000 0000 0000 0000 0001 = -1

原码、反码、补码相关知识参阅:
https://blog.csdn.net/weixin_34344677/article/details/86377391

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章