c++ - 在一个字节中交换半字节

标签 c++ bit-manipulation

考虑下面交换一个字节中的半字节的代码:

#include <stdio.h>

unsigned char swapNibbles(unsigned char x)
{
    return ( (x & 0x0F)<<4 | (x & 0xF0)>>4 );
}

int main()
{
    unsigned char x = 100;
    printf("%u", swapNibbles(x));
    return 0;
}

为什么需要用 0x0F 和 0xF0 进行运算?相反,我可以写

return ((x<<4) | (x>>4));

我用谷歌搜索了一下,人们似乎说它不适用于负数,因为它会用右移的数字填充数字,但是用 0xF0 不会使数字为正数? 我错过了什么?

最佳答案

这两个变体是 100% 等效的。 gcc 和 clang 都能够将每个代码片段转换为简单的 rol 指令并将它们编译为相同的汇编代码(当然启用了优化)

unsigned char swapNibbles(unsigned char x)
{
    return (x & 0x0F)<<4 | (x & 0xF0)>>4;
}

unsigned char swapNibbles2(unsigned char x)
{
    return  x << 4 | x >>4 ;
}
swapNibbles(unsigned char):                       # @swapNibbles(unsigned char)
        mov     eax, edi
        rol     al, 4
        ret
swapNibbles2(unsigned char):                      # @swapNibbles2(unsigned char)
        mov     eax, edi
        rol     al, 4
        ret

关于c++ - 在一个字节中交换半字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47114773/

相关文章:

c++ - std::set 用作静态模板化成员变量

c++ - C++ 应用程序中的 Telnet 服务器

c++ - 现代 OpenGL 2D 和 3D 绘图问题

c# - 按位将 long 解包为两个数字

assembly - 计算机如何求模数?

php - 不同机器上的按位运算结果不同

python - 在 python 中通过引用传递引用

c++ - 具有成对参数的模板函数

c# - 按位运算符让我见鬼去吧

c++ - 在不使用 bitset 的情况下如何知道 C++ 中的位状态?