c ++中的位操作

时间:2015-09-30 04:03:35

标签: c++ bitwise-operators

我想用4294967295取一个数字的按位XOR,即(pow(2,32)-1)。我在这里使用:编号^ 4294967295直接。但结果是错误的。那么这个操作是如何发生的。建议是否有更好的方法来做到这一点。

P.S-我在https://www.hackerrank.com/challenges/flipping-bits中使用这种技术。

Edit1:结果1 ^ 4294967295(00000000000000000000000000000001 ^ 11111111111111111111111111111111)应该  be 4294967294(11111111111111111111111111111110)。

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;
}

2 个答案:

答案 0 :(得分:1)

您的代码可以正常使用以下更改:

  1. int var; - &GT;改为 - &gt; unsigned int var;

  2. int temp = 4294967295; - &GT;改为 - &gt; unsigned int temp = 4294967295;

  3. signed int的范围为[-2,147,483,648到2,147,483,647]

    unsigned int的范围为[0到4,294,967,295]

答案 1 :(得分:0)

有一个运营商。在this table中查看按位而不是

live example

#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>),它还有助于使用固定大小的类型(例如hexadecimal)并在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