在小端机器上,位操作符如何工作?

时间:2013-07-18 04:55:05

标签: c bit-manipulation endianness

我有以下代码从文件中获取像素值。我在运行OS X的英特尔Macbook上。我相信这是小端的。我有以下代码用于确定是否在像素上设置了最低有效位。它编译并运行,但我不确定操作是否真的给了我正确的数据。

 typedef struct {
    unsigned char blue;
    unsigned char green;
    unsigned char red;
 } pixel_t;

 pixel_t *pixels = malloc(((bmp->dib.bmp_bytesz/3)+1) * sizeof(*pixels));

 printf("%u", (pixels[i].red & 0x01));
 printf("%u", (pixels[i].green & 0x01));
 printf("%u", (pixels[i].blue & 0x01));

3 个答案:

答案 0 :(得分:7)

Little-endian和big-endian是指较大单位(如shortint)的字节顺序(不是位,本身)。

按位运算是相同的;操作在pixels[i].blue等中为您提供最不重要的数字。如果它们存储在char(或unsigned charsigned char)中,则没有问题。如果它们存储在intshort或其他内容中,那么正在寻址的字节将根据机器是big-endian还是little-endian而有所不同,但它仍然是最不重要的平台上的一点数字。

答案 1 :(得分:5)

Endianess是影响值存储的内部细节。它对计算的值的方式没有影响。

答案 2 :(得分:2)

乔纳森已经有了正确的答案......只是添加一个例子。

Endianness描述了多字节数据如何存储在计算机内存中。它描述了内存中地址的最高有效字节(MSB)和最低有效字节(LSB)的位置。 Big Endian:首先存储MSB,即从左到右 Little Endian:首先存储LSB,即从右到左。

示例:0x04030201如何存储在内存中?

Address     BE  LE
00000000    04  01
00000001    03  02
00000002    02  03
00000003    01  04