C++中的位运算
Bit operation in c++
我想对一个数字与 4294967295 进行按位异或,即 (pow(2,32)-1)。这里我直接使用:number^4294967295。但是结果是wrong.So这个操作是怎么发生的。建议是否有更好的方法。
P.S- 我在 https://www.hackerrank.com/challenges/flipping-bits 中使用了这种技术。
Edit1:1^4294967295 (0000000000000000000000000000001^11111111111111111111111111111111) 的结果应该
是 4294967294 (1111111111111111111111111111110).
Edit2:包含代码:
#include <cmath>
#include <iostream>
using namespace std;
int main() {
int t;
cin>>t;
int i=31;
while(t--){
int var;
char arr[i];
int temp = 4294967295;
cin>>var;
var= var^temp;
cout<<var<<endl;
}
return 0;
}
您的代码将通过以下更改正常工作:
int 变量; --> 改为 --> unsigned int var;
int temp = 4294967295; --> 改为 --> unsigned int temp = 4294967295;
signed int 的范围是 [−2,147,483,648 到 2,147,483,647]
unsigned int 的范围是 [0 到 4,294,967,295]
有一个操作员。在this table.
中查看按位不
#include <cstdint>
#include <iostream>
#include <iomanip>
int main() {
uint32_t var;
std::cin >> std::hex >> var;
const uint32_t result = ~var;
std::cout << std::hex << result << "\n";
}
输出(当给定 1
作为输入时):
fffffffe
如果您坚持按照自己的方式进行,则需要使用无符号类型。它也有助于使用固定大小的类型(例如 uint32_t
from <cstdint>
) and to represent your literals in hexadecimal, for convenience (live example):
#include <cstdint>
#include <iostream>
#include <iomanip>
int main() {
const uint32_t mask = 0xffffffff;
uint32_t var;
std::cin >> std::hex >> var;
const uint32_t result = var ^ mask;
std::cout << std::hex << result << "\n";
}
输出(当给定 1
作为输入时):
fffffffe
我想对一个数字与 4294967295 进行按位异或,即 (pow(2,32)-1)。这里我直接使用:number^4294967295。但是结果是wrong.So这个操作是怎么发生的。建议是否有更好的方法。
P.S- 我在 https://www.hackerrank.com/challenges/flipping-bits 中使用了这种技术。
Edit1:1^4294967295 (0000000000000000000000000000001^11111111111111111111111111111111) 的结果应该 是 4294967294 (1111111111111111111111111111110).
Edit2:包含代码:
#include <cmath>
#include <iostream>
using namespace std;
int main() {
int t;
cin>>t;
int i=31;
while(t--){
int var;
char arr[i];
int temp = 4294967295;
cin>>var;
var= var^temp;
cout<<var<<endl;
}
return 0;
}
您的代码将通过以下更改正常工作:
int 变量; --> 改为 --> unsigned int var;
int temp = 4294967295; --> 改为 --> unsigned int temp = 4294967295;
signed int 的范围是 [−2,147,483,648 到 2,147,483,647]
unsigned int 的范围是 [0 到 4,294,967,295]
有一个操作员。在this table.
中查看按位不#include <cstdint>
#include <iostream>
#include <iomanip>
int main() {
uint32_t var;
std::cin >> std::hex >> var;
const uint32_t result = ~var;
std::cout << std::hex << result << "\n";
}
输出(当给定 1
作为输入时):
fffffffe
如果您坚持按照自己的方式进行,则需要使用无符号类型。它也有助于使用固定大小的类型(例如 uint32_t
from <cstdint>
) and to represent your literals in hexadecimal, for convenience (live example):
#include <cstdint>
#include <iostream>
#include <iomanip>
int main() {
const uint32_t mask = 0xffffffff;
uint32_t var;
std::cin >> std::hex >> var;
const uint32_t result = var ^ mask;
std::cout << std::hex << result << "\n";
}
输出(当给定 1
作为输入时):
fffffffe