反转整数 x 中的位

发布于 2024-12-05 01:46:28 字数 517 浏览 0 评论 0原文

位反转

我发现这段代码用于反转整数 x 中的位(假设为 32 位值):

unsigned int
reverse(register unsigned int x)
{
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
return((x >> 16) | (x << 16));
}

我无法理解这段代码背后的逻辑/算法。所有神奇数字的目的是什么?

Bit Reversal

I found this code for reversing the bits in an integer x (assume a 32bit value):

unsigned int
reverse(register unsigned int x)
{
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
return((x >> 16) | (x << 16));
}

I am unable to understand the logic/algorithm behind this code. What is the purpose of all the magic numbers?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不醒的梦 2024-12-12 01:46:28

让我们看看它是如何处理 8 位值的:

函数中的第一行采用每隔一个位并将其向左或向右移动:

12345678  -->  1-3-5-7-  -->  -1-3-5-7  -->  21436587
               -2-4-6-8       2-4-6-8-

第二行采用两位一组并向左或向右移动:

21436587  -->  21--65--  -->  --21--65  -->  43218765
               --43--87       43--87--

第三行采用四位一组位并向左或向右移动:

43218765  -->  4321----  -->  ----4321  -->  87654321
               ----8765       8765----

现在位被反转。对于 32 位值,您还需要两个步骤来移动 8 和 16 组中的位。

Let's look at how it's done for an 8 bit value:

The first line in the function takes every second bit and moves it left or right:

12345678  -->  1-3-5-7-  -->  -1-3-5-7  -->  21436587
               -2-4-6-8       2-4-6-8-

The second line takes groups of two bits and moves left or right:

21436587  -->  21--65--  -->  --21--65  -->  43218765
               --43--87       43--87--

The third line takes groups of four bits and moves left or right:

43218765  -->  4321----  -->  ----4321  -->  87654321
               ----8765       8765----

Now the bits are reversed. For a 32 bit value you need two more steps that moves bits in groups of 8 and 16.

°如果伤别离去 2024-12-12 01:46:28

那是位掩码。将它们写成二进制形式并记住按位与的工作原理。您还可以拿一张纸写下每个步骤的掩码、输入和结果来进行整理。

That's bit masks. Write them in binary form and remember how bitwise and works. You can also take a piece of paper and write down every step's masks, input and result to sort it out.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文