无符号整数中的C ++按位补码返回负值

时间:2015-08-25 20:48:31

标签: c++ bit-manipulation long-integer bitwise-operators bitset

我只是想用~运算符在C ++中进行按位补码:

例如:

NOT 0101
--------
    1010

所以在下面的代码中,我希望得到1010,但我得到负数。虽然我用unsigned类型定义了值,但是怎么可能呢?

#include <iostream>
#include <stdio.h>
#include <string>
#include <bitset>
using namespace std;

int tob(int num) {
    if (num == 0)
        return 0;
    return (num % 2) + 10*tob(num/2);
}

long unsigned int tol(string st) {
    long unsigned int num = bitset<100>(st).to_ulong();
    return num;
}


int main()
{
    unsigned int x = tol("0101");
    unsigned int z = ~x;
    printf("%10d (decimal %u)\n", tob(z), z);
    // -110 (decimal -6)
    cout << tob(z) << endl; // -110
    cout << z << endl; // -110
}

如何在C ++中从1010获取not 0101

谢谢!

2 个答案:

答案 0 :(得分:6)

unsigned int通常有32位,所有这些都在这里被反转:

NOT 0000 0000 0000 0000 0000 0000 0000 0101
-------------------------------------------
    1111 1111 1111 1111 1111 1111 1111 1010

如果您只想要最后4位并将其余位置归零,请应用掩码:

unsigned int z = ~x & 0xf; // 1111 in binary

您也可以通过简单的按位XOR获得所需的结果:

unsigned int z = x ^ 0xf;

顺便说一下,你的代码将无法打印更大数字的二进制表示,因为int不能保持高于2 ^ 32的值(从100 0000 0000(十进制)开始) 。为此,我建议使用std::bitset打印或在下面的答案中使用直接方法,而不是使用tob函数。

答案 1 :(得分:2)

  

[...]如何在C ++中从0101获得1010?

对{strong>四个位使用std::bitset

std::bitset<4> x("0101");
auto z = ~x;
std::cout << '~' << x << '=' << z << std::endl;

Example on Coliru