C++;无符号整数中的位补码返回负值 我只是尝试C++中的位补码,用 ~运算符:

C++;无符号整数中的位补码返回负值 我只是尝试C++中的位补码,用 ~运算符:,c++,bit-manipulation,long-integer,bitwise-operators,bitset,C++,Bit Manipulation,Long Integer,Bitwise Operators,Bitset,例如: NOT 0101 -------- 1010 所以在下面的代码中,我希望得到1010,但我得到的是负数。虽然我使用无符号类型定义值,但这怎么可能呢 #include <iostream> #include <stdio.h> #include <string> #include <bitset> using namespace std; int tob(int num) { if (num == 0) r

例如:

NOT 0101
--------
    1010
所以在下面的代码中,我希望得到
1010
,但我得到的是负数。虽然我使用
无符号
类型定义值,但这怎么可能呢

#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
}
#包括
#包括
#包括
#包括
使用名称空间std;
int tob(int num){
如果(num==0)
返回0;
返回(数量%2)+10*tob(数量/2);
}
长无符号整数tol(字符串st){
long unsigned int num=位集(st).to_ulong();
返回num;
}
int main()
{
无符号整数x=tol(“0101”);
无符号整数z=~x;
printf(“%10d(十进制%u)\n”,tob(z),z);
//-110(十进制-6)
库特
<如何从C++中的非0101得到1010?

对四个位使用a

std::bitset<4> x("0101");
auto z = ~x;
std::cout << '~' << x << '=' << z << std::endl;
std::位集x(“0101”);
自动z=~x;
标准::cout
<如何从C++中的非0101得到1010?

对四个位使用a

std::bitset<4> x("0101");
auto z = ~x;
std::cout << '~' << x << '=' << z << std::endl;
std::位集x(“0101”);
自动z=~x;

std::cout
无符号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
您也可以使用简单的按位异或获得所需的结果:

unsigned int z = x ^ 0xf;

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

无符号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
您也可以使用简单的按位异或获得所需的结果:

unsigned int z = x ^ 0xf;

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

您的代码中似乎以奇怪的方式混合了二进制和十进制表示。我不确定您正试图实现什么,但您可以使用
std::bitset
打印b这个问题中的一个数字的一次表示法:这基本上与你问的关于go的问题相同:你的
tob
接受
int
并返回
int
,你用%d打印它,你问我们为什么非单数变成负数?你似乎以奇怪的方式混合了二进制和十进制表示法在你的代码中。我不确定你到底想完成什么,但是你可以使用
std::bitset
来打印一个数字的二进制表示,就像这个问题:这基本上和你问的关于go的问题一样:你的
tob
接受
int
并返回
int
,然后用%d打印,然后问我们为什么非单数变成负数?这仍然不能解释为什么
cout,这仍然不能解释为什么
cout