#include<iostream>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int x=32;
long long n;
long long t=1;
cin>>n;
while(x--){
n=(n^t);
t=t<<1;
}
cout<<n<<endl;
}
return 0;
}
输入 3 2147483647 1 0
输出 2147483648 4294967294 4294967295
上面的代码反转了数字,并将结果解释为无符号整数。为什么这样?结果数字不应该是负数吗? 此外,如果我在数字n上仅使用否定运算符(〜),而不是while循环,则打印的结果为负数。
输出 -2147483648 -2 -1
执行上述操作时,数字的二进制表示是否相同?为什么它的解释不同?在第一种情况下未签名并在第二种情况下签名?当long long被long替换时,产生的结果保持不变。
有人可以向我解释这是如何运作的吗?
答案 0 :(得分:1)
你一次一个地反转32位(为什么,XOR可以在一次操作中反转你选择的任何一组位)。因为long long
始终至少为64位,这意味着您不会更改符号位。
否定运算符会反转所有位。
当您切换到long
而不是long long
时,您将遇到麻烦。如果您的平台具有32位long
(这是最小大小,但C ++允许更多且许多实际C ++平台具有64位长),那么您的循环将从最高幅度位左移,它给出了一个依赖于实现的结果(可能会改变符号),然后最后一次循环将再次移动,导致未定义的行为。