0

我正在编写书中的练习。这个程序应该设置一个“位图图形设备”位,然后检查它们是1还是0。设置函数已经写好了,所以我只写了test_bit函数,但它不起作用。在 main() 中,我将第一个字节的第一位设置为 1,因此字节为 10000000,然后我想测试它:10000000 & 10000000 == 10000000,所以不为空,但是当我想打印它时我仍然得到错误出去。怎么了?

#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;
}
4

2 回答 2

1

我想你0x80>>不想1>>test_bit。右移一位往往会产生零。

你还需要写(a & b) != 0. ==和的优先级!=高于 的&,所以a & b != 0被解析为好像是写a & (b != 0)的 。(一个旧的 C/C++ 问题。)

于 2013-08-31T12:53:08.350 回答
1

在 MSVC++ 中,我收到编译器警告(C4554 'operator' : check operator priority for possible error; use括号来澄清优先级

添加括号,它可以工作,如下所示:

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, 或falseresp。

于 2013-08-31T13:12:13.453 回答