如何制作输出NOT(x)的程序?
例:
解释:
01至10
printf("%i\n%i\n%i\n", ~12, ~0, ~2);
打印:
-13
-1
-3
printf("%i\n%i\n%i\n", !12, !0, !2);
Run Code Online (Sandbox Code Playgroud)
打印:
0
1
0
Run Code Online (Sandbox Code Playgroud)
你的printf的可变参数正被提升为int,把它想象为先在变量中存储你的位(int),然后在它们上执行bit-not:
int x = 12; // 0x0000000C
int y = ~x; // 0xFFFFFFF4
Run Code Online (Sandbox Code Playgroud)
y现在是负的signed int值.
将您的格式字符串和值更改为无符号,它可能更接近您要查找的内容:
int main(int argc, char *argv[])
{
unsigned int x = 12;
unsigned int y = ~x;
printf("%u:%u\n",x,y);
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
结果:
12:4294967283
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找打印值的实际"位"的功能,可以在这里找到一个很好的起点,因为printf()没有本机位二进制打印功能.
最后,如果您对翻转感兴趣的是前导最重要的非零位,请确保在输入值为零(0)时对您的情况进行特殊调整.你真的需要一个"这很多位对我来说很重要"的价值来真正做到这一点.
编辑:一个非常低效的BitString:显然,如果没有数字类型 的引导模板参数,这将无法工作.自行决定使用(并承担风险).
template<typename T, size_t N=sizeof(T)*8>
std::string bit_string(T value, size_t maxbits=N)
{
static const char *one = "1";
static const char *zero = "0";
std::string result;
maxbits = std::min(maxbits, N);
for (size_t i=0;i<maxbits;i++)
{
result = ((value & T(1)) ? one : zero) + result;
value >>= 1;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)