简单的钻头设置和清洁

时间:2013-08-31 12:50:12

标签: c++ algorithm bitmap

我正在用书编写练习。该程序应设置“位图图形设备”位,然后检查它们中的任何一个,如果它们是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;
}

2 个答案:

答案 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) != 0true1为整数。然后0x80 & 0x01会产生0false resp。