1 c++ bit-manipulation bitwise-operators bitset long-integer
我只是尝试使用~运算符在C++中进行按位补码:
例如:
NOT 0101
--------
1010
Run Code Online (Sandbox Code Playgroud)
所以在下面的代码中,我期待得到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
}
Run Code Online (Sandbox Code Playgroud)
我如何1010从not 0101C++中获益?
谢谢!
unsigned int 通常有32位,所有这些都在这里被反转:
NOT 0000 0000 0000 0000 0000 0000 0000 0101
-------------------------------------------
1111 1111 1111 1111 1111 1111 1111 1010
Run Code Online (Sandbox Code Playgroud)
如果您只想要最后4位并将其余部分归零,请应用掩码:
unsigned int z = ~x & 0xf; // 1111 in binary
Run Code Online (Sandbox Code Playgroud)
您也可以通过简单的按位XOR获得所需的结果:
unsigned int z = x ^ 0xf;
Run Code Online (Sandbox Code Playgroud)
顺便说一下,你的代码将无法打印更大数字的二进制表示,因为它int不能保持高于2 ^ 32的值(从100 0000 0000(十进制)开始).为此,我建议std::bitset在下面的答案中使用或直接进行打印而不是使用tob功能.