如何在不使用bitset的情况下显示unsigned int中的位?

问题描述 投票:0回答:1

我目前正在研究一个涵盖位操作的学校项目。我们应该显示无符号整数变量的位,并允许用户操纵它们,打开和关闭它们并移动它们。除了在操作后显示位,我才能使用所有功能。我们不允许使用bitset来显示位,这将导致严重的等级降低。

我已经尝试使用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关于控制台一半的长度。

c++ visual-c++
1个回答
0
投票

这里有几个问题,您可能想要对位操作进行详细的审查:

  • for (int i = sizeof(int)*8; i > 0; i--)应该是for (int i = sizeof(int)*8 - 1; i >= 0; i--),因为位是0索引的(向左移动1次,在最右边的位置给出一个设置位)。
  • 我们使用按位AND(&)而不是按位OR(|)来检查是否设置了一个位。这是因为当我们使用按位AND并且只有一个位设置的数字时,结果将是一个掩码,其中1位的位与原始数字中的相应位处于相同的状态(因为任何东西) AND 1本身),所有其他位为0(因为任何AND 0都是0)。
  • 我们想要一个在我们要检查的位置为1的掩码,在其他地方需要0,所以我们需要1 << i而不是0 << i
  • 如果我们正在检查的位被设置,我们最终会得到一个设置了一位的数字,但不一定是1.所以我们应该检查结果是否不等于0而不是检查它是否等于1 。
  • ==higher precedence算子相比,|算子具有&,因此需要括号。
© www.soinside.com 2019 - 2024. All rights reserved.