我正在用书编写练习。该程序应设置“位图图形设备”位,然后检查它们中的任何一个,如果它们是1或0.设置功能已经写入,所以我只写了test_bit函数,但它不起作用。 在main()中,我将第一个字节的第一位设置为1,因此字节为10000000,然后我想测试它:10000000& 10000000 == 10000000,所以不是null,但是当我想打印出来时,我仍然会得到假。怎么了?
#include <iostream>
const int X_SIZE = 32;
const int Y_SIZE = 24;
char graphics[X_SIZE / 8][Y_SIZE];
inline void set_bit(const int x, const int y)
{
graphics[(x)/8][y] |= (0x80 >> ((x)%8));
}
inline bool test_bit(const int x, const int y)
{
return (graphics[x/8][y] & (0x80 >> ((x)%8)) != 0);
}
void print_graphics(void) //this function simulate the bitmapped graphics device
{
int x;
int y;
int bit;
for(y=0; y < Y_SIZE; y++)
{
for(x = 0; x < X_SIZE / 8; x++)
{
for(bit = 0x80;bit > 0; bit = (bit >> 1))
{
if((graphics[x][y] & bit) != 0)
std::cout << 'X';
else
std::cout << '.';
}
}
std::cout << '\n';
}
}
main()
{
int loc;
for (loc = 0; loc < X_SIZE; loc++)
{
set_bit(loc,loc);
}
print_graphics();
std::cout << "Bit(0,0): " << test_bit(0,0) << std::endl;
return 0;
}
答案 0 :(得分:1)
我认为您希望0x80>>
中的1>>
不是test_bit
。向右移动往往会产生零。
你还需要写(a & b) != 0
。 ==
和!=
的优先级高于&
的优先级,因此a & b != 0
的解析方式就像是a & (b != 0)
一样。 (旧的C / C ++问题。)
答案 1 :(得分:1)
在MSVC ++中,我收到编译器警告(C4554 'operator' : check operator precedence for possible error; use parentheses to clarify precedence)
添加括号,它的工作方式如下:
inline bool test_bit(const int x, const int y)
{
return ( ( graphics[x/8][y] & (0x80 >> ((x)%8)) ) != 0);
// ^ ^ Added parentheses
}
<强>解释强>:
问题在于订单。原始行将首先评估(0x80 >> ((x)%8) != 0
,true
或1
为整数。然后0x80 & 0x01
会产生0
或false
resp。