我目前正在研究一个涵盖位操作的学校项目。我们应该显示无符号整数变量的位,并允许用户操纵它们,打开和关闭它们并移动它们。除了在操作后显示位,我才能使用所有功能。我们不允许使用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
关于控制台一半的长度。
这里有几个问题,您可能想要对位操作进行详细的审查:
for (int i = sizeof(int)*8; i > 0; i--)
应该是for (int i = sizeof(int)*8 - 1; i >= 0; i--)
,因为位是0索引的(向左移动1次,在最右边的位置给出一个设置位)。&
)而不是按位OR(|
)来检查是否设置了一个位。这是因为当我们使用按位AND并且只有一个位设置的数字时,结果将是一个掩码,其中1位的位与原始数字中的相应位处于相同的状态(因为任何东西) AND 1本身),所有其他位为0(因为任何AND 0都是0)。1 << i
而不是0 << i
。==
和higher precedence算子相比,|
算子具有&
,因此需要括号。