为什么要执行 Bit-shift 两次 ((x >> 4) << 4)?
Why would you perform a Bit-shift twice ((x >> 4) << 4)?
所以我正在分析 Nes-Emulator 代码,我遇到了这行我无法理解的代码:
nMapperID = ((header.mapper2 >> 4) << 4) | (header.mapper1 >> 4);
为什么header.mapper2 bit-shifted一次向右然后向左
顺便说一句,header是这个结构:
struct sHeader
{
char name[4];
uint8_t prg_rom_chunks;
uint8_t chr_rom_chunks;
uint8_t mapper1;
uint8_t mapper2;
uint8_t prg_ram_size;
uint8_t tv_system1;
uint8_t tv_system2;
char unused[5];
} header;
移位是不是位的旋转。出现的新位全为0。所以这个表达式:
(header.mapper2 >> 4) << 4)
首先清除低4位,然后将所有位向左移回。
例如如果你有像 01010101
这样的位模式,右移将首先使位成为 00000101
,然后左移将使它成为 01010000
(因此清除最右边的 4 位) .
如果它是位的旋转(正如您所期望的那样),那么它实际上是一个空操作。
所以我正在分析 Nes-Emulator 代码,我遇到了这行我无法理解的代码:
nMapperID = ((header.mapper2 >> 4) << 4) | (header.mapper1 >> 4);
为什么header.mapper2 bit-shifted一次向右然后向左
顺便说一句,header是这个结构:
struct sHeader
{
char name[4];
uint8_t prg_rom_chunks;
uint8_t chr_rom_chunks;
uint8_t mapper1;
uint8_t mapper2;
uint8_t prg_ram_size;
uint8_t tv_system1;
uint8_t tv_system2;
char unused[5];
} header;
移位是不是位的旋转。出现的新位全为0。所以这个表达式:
(header.mapper2 >> 4) << 4)
首先清除低4位,然后将所有位向左移回。
例如如果你有像 01010101
这样的位模式,右移将首先使位成为 00000101
,然后左移将使它成为 01010000
(因此清除最右边的 4 位) .
如果它是位的旋转(正如您所期望的那样),那么它实际上是一个空操作。