我目前正在为学校进行覆盖位操作的项目。我们应该显示一个无符号整数变量的位,并允许用户操纵它们,打开和关闭它们并对其进行移位。我可以使用所有功能,除了一旦操作过就显示位。我们不允许使用位集来显示位,这将导致严重的等级降低。
我尝试使用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
字符串,大约是控制台一半的长度。
答案 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 << i
而不是0 << i
。==
和|
运算符相比,&
运算符具有higher precedence,因此需要括号。