如何使用位集显示无符号整数中的位?

时间:2019-04-29 21:41:32

标签: c++ visual-c++

我目前正在为学校进行覆盖位操作的项目。我们应该显示一个无符号整数变量的位,并允许用户操纵它们,打开和关闭它们并对其进行移位。我可以使用所有功能,除了一旦操作过就显示位。我们不允许使用位集来显示位,这将导致严重的等级降低。

我尝试使用if语句来确定这些位是打开还是关闭,但这似乎不起作用。只要更改一点,它就会简单地打印很多0和1。

std::cout << "Bits: ";

for (int i = sizeof(int)*8; i > 0; i--)
{

    if (a | (0 << i) == 1)
        std::cout << 1;
    if (a | (0 << i) == 0)
        std::cout << 0;

}

std::cout << std::endl << a;

我希望,如果我打开一点,那一位将显示1而不是0,其余的位保持不变并仍显示0 ;而是打印一个1010101字符串,大约是控制台一半的长度。

1 个答案:

答案 0 :(得分:0)

这里有几个问题,您可能需要对位操作进行详细的回顾:

  • for (int i = sizeof(int)*8; i > 0; i--)应该为for (int i = sizeof(int)*8 - 1; i >= 0; i--),因为位是0索引的(向左移动1到0会在最右边的位置置位)。
  • 我们使用按位与(&)代替按位OR(|)来检查是否设置了位。这是因为当我们将按位与与仅设置单个位的数字一起使用时,结果将是一个掩码,掩码中1位置的位与原始编号中的相应位处于相同状态(因为AND 1本身),其他所有位均为0(因为AND 0为0)。
  • 我们想要一个要检查的位置为1的遮罩,而在其他位置为0,因此我们需要1 << i而不是0 << i
  • 如果我们要检查的位被设置,我们将得到一个设置了一位的数字,但不一定是1。所以我们应该检查结果是否不等于0,而不是检查结果是否为0。等于1。
  • ==|运算符相比,&运算符具有higher precedence,因此需要括号。