【发布时间】:2017-03-20 19:16:41
【问题描述】:
我正在编写一个小测试程序,将 64 位数字从小端格式转换为大端格式。
int main(void){
uint64_t value1 = 1234;
uint64_t value2 = 0;
uint64_t constant = 0xFF00000000000000;
uint8_t i;
for(i = 0; i < 4; i++){
int8_t shift = 56 - 16 * i; // Gives me the sequence 56, 40, 24, 8.
value2 |= (value1 & constant) >> shift;
constant = constant >> 2;
}
for(i = 0; i < 4; i++){
int8_t shift = 16 * i + 8; // Gives me the sequence 8, 24, 40, 56. value2 |= (value1 & constant) << shift;
constant = constant >> 2;
}
printf("\n\nvalue1: %" PRIu64, value1);
printf("\nvalue2: %" PRIu64, value2);
}
这有点令人费解,但这是我遇到问题的按位移位操作。线
constant = constant >> 2;
没有给我我所期望的。我希望0xFF00000000000000 在一个循环后变成0x00FF000000000000,依此类推。相反,它变成了0x3FC0000000000000。
我认为其他班次操作也存在类似问题。谁能解释一下?
我的第一个猜测是位运算符只能在 32 位数字上正常工作。在这种情况下,我可以转换一个 32 位指针并一次处理每个 32 位块。但我想避免这种情况,因为它更加复杂。
【问题讨论】:
-
constant >> 2将数字向右移动两个位。 -
移动一个字节:
constant >> 8 -
注意:将变量称为“常量”可能不是一个好主意。
-
循环为
for(i = 0; i < 4; i++)会让你省去神奇的数字72。 -
为什么 64 位类型的移位运算符会有限制? (反问,当然没有)。您的指针方法 otoh 会调用未定义的行为。
标签: c bitwise-operators endianness