繁体   English   中英

我如何正确地移动此uint64_t数字?

[英]How can I correctly shift this uint64_t number?

我正在编写一个小型测试程序,该程序可以将64位数字从little-endian格式转换为big-endian格式。

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位块。 但我想避免这种情况,因为它更加令人费解。

这必须在使用按位运算符时使用。 请看下面的简单说明。

在您的情况下, 0xFF0000...000实际上是二进制表示形式的0b111111110000...000 当必须以二进制读取0000至1111时,实际上是以十六进制表示为0至F。 该按位运算符按位进行操作,因此在进一步研究之前,需要将此十六进制表示形式分解为二进制。

现在将2位移位给出0b001111111100...000 仔细观察,这是0b<0011><1111><1100>00...000 ,实际上是0x3FC00...000

希望它能解释!

>>运算符按运算符右侧的位数进行位移。 如果要移动1个字节(2个半字节),则应使用constant >> 8 无论要应用移位的变量的大小如何,它的工作原理都完全相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM