c - 无法将二进制转换为十进制

标签 c bit-manipulation bit

我的目标是得到一个与用户指定的二进制前导相同的十进制,它存储在unsigned long变量mask中;其余位将设置为零。

int mask; 
scanf("%d",&mask);
unsigned long subnetMask = 0;
int counter = 31,a;
for(int a = mask, a > 0; a--) {
     subnetMask += pow(2,counter);
     counter--;
}
printf("%ld",subnetMask);

现在,当用户输入 24 时,掩码的二进制字符串为 11111111 11111111 11111111 00000000,我正在尝试将其转换为基数 10。

它没有给我正确的输出 4294967040,而是给了我 -128。我知道某些部分存在内存溢出,但我不知道在哪里。我尝试了多种方法,例如将 subnetMask 的数据类型替换为 intlong

最佳答案

在 32 位或更大的机器上,您可以不循环地解决原始问题:

unsigned long subnetMask = mask ? - (1<<(32 - mask)) : 0;

此外,subnetMask 在 32 位计算机上不必太长。这段代码显示了表达式的正确性:

 for(int mask = 0; mask < 33; mask++)
{
    unsigned subnetMask = mask ? - (1<<(32 - mask)) : 0;

    printf("%2d => %08x = %u (decimal)\n",  mask, subnetMask, subnetMask );
}

关于c - 无法将二进制转换为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41842180/

相关文章:

c - 使用 XOR 按位运算执行逐字节比较

c++ - 在值 C++ 中搜索设置/取消设置位组合

c - 如果计算机是 "copying bits",为什么 signed int 会自动转换为 unsigned int?

integer - EDSAC - 17 位和 35 位整数

c - C 中矩阵的维数

c - How to compile nanopb .proto file into .h and .c files using nanopb and protobuf (`protoc` 编译问题)

c - 水平翻转位掩码

java - 位运算--如何改变现有的颜色?

c - 用 printf 在 C 中重载方法?

c - Windows下运行的C二进制文件中的已初始化数据段