猿问

切换位顺序的快速方法?

我有一个这样的二进制文件

10011011

我的数据存储是这样的10,01,10,11,但我想这样重新排序

11100110

数据看起来像11,10,01,10。这个操作与ByteOrder转换相同,但在位级别。

任何快速的 bitop 方法来做到这一点?

目前,我必须将其解码为四个 int 然后合并为一个。


牧羊人nacy
浏览 248回答 2
2回答

万千封印

您可以一步使用位掩码和位移位来完成它,而无需将其分解为 4 个不同的变量:Go 解决方案(在Go Playground上尝试):i := 0x9b // 10011011fmt.Printf("%b\n", i)i = (i&0x03)<<6 | (i&0x0c)<<2 | (i&0x30)>>2 | (i&0xc0)>>6fmt.Printf("%b\n", i)输出:1001101111100110在 Java 中:int i = 0x9b; // 10011011System.out.printf("%x\n", i);i = (i & 0x03) << 6 | (i & 0x0c) << 2 | (i & 0x30) >> 2 | (i & 0xc0) >> 6;System.out.printf("%x\n", i);输出(它是十六进制,但代表相同的数字):9be6由于每个位组(2 位组)都必须从输入中的原始位置移动,我认为您无法以更少的步骤(屏蔽和移位等步骤)来完成。如果这对您来说还不够快,那么加快速度的唯一选择是预先计算转换并将结果存储在@ruakh 的回答中详述的数组中。当然,如果我们允许超过 8 位,这将变得不可行。

幕布斯6054654

最快的方法可能是预先计算所有值的表:final int[] values = new int[256];for (int i = 0; i < 256; ++i) {&nbsp; &nbsp; values[i] = (i & 0b1100_0000) >> 6&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | (i & 0b0011_0000) >> 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | (i & 0b0000_1100) << 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | (i & 0b0000_0011) << 6;}然后使用数组查找而不是位操作。自然地,您会想要配置文件。
随时随地看视频慕课网APP

相关分类

Go
我要回答