使用按位运算符将十进制转换为二进制

问题描述 投票:0回答:2
#include <stdio.h>

int main()
{
  int decimal_num, c, result;

  printf("Enter an integer in decimal number system\n");
  scanf("%d", &decimal_num);

  for (c = 31; c >= 0; c--)
  {
    result = decimal_num >> c;

    if (result & 1)
      printf("1");
    else
      printf("0");
  }

  printf("\n");

  return 0;
}

此代码采用十进制数并使用按位运算符将其转换为二进制数。我很难理解 for 循环

result = decimal_num >> c
内部的逻辑以及为什么它从
for (c = 31; c >= 0; c--)
迭代。我了解按位与、或、异或和非的基础知识,并且我知道当奇数与“1”进行“与”运算时,结果是“1”,否则“0”(因为所有赔率的最低有效位是1)。

c bit-manipulation bitwise-operators
2个回答
10
投票

这是代码的解释:

程序从左开始扫描十进制数字的按位表示形式进行写入,对每一位进行操作。十进制数字应该有 32 位,因此 for 循环运行 32 次。

第一次,c的值为31。

假设decimal_num最初的位表示为 x................................(.代表任意数字)

decimal_num >> 31 将所有位向右移动 31 次,使得第一位移动到最右端。结果是 0000000000000000000000000000x。请注意,当数字移位时,0 会被添加到左端。

然后检查结果是 0 还是 1,并相应地打印。 0000000000000000000000000000x & 00000000000000000000000000001 = 1(如果 x 为 1) 0000000000000000000000000000x & 00000000000000000000000000001 = 0(如果 x 为零)。

继续,当 c 为 30 时检查第二位。:

.Y.........................

decimal_num >> 30 结果 000000000000000000000000000000.Y

000000000000000000000000000.Y & 00000000000000000000000000001 = 1(如果 Y 为 1) 000000000000000000000000000.Y & 00000000000000000000000000001 = 0(如果 Y 为零)。

我们继续打印结果,直到最后一位数字。

希望这可以帮助您理解。


0
投票
function decimalToBinary(n) 
{
    let isNegative = false;

    if (n < 0) {
        isNegative = true;
        n = -n; // Make the number positive
    }

    let binaryStr = '';

   
    while (n > 0) {
        let bit = n & 1; // Get the least significant bit
        binaryStr = bit + binaryStr; 
        n = n >> 1; // Right shift to remove the processed bit
    }
    // If the number was negative, prepend a '-' sign
    if (isNegative) {
        binaryStr = '-' + binaryStr;
    }

    return binaryStr === '' ? '0' : binaryStr; // Handle the case when n is 0
} 

// 输入 = 5, // 输出:“101” // 输入 = -5, // 输出: "-101"

© www.soinside.com 2019 - 2024. All rights reserved.