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

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