为了账号安全,请及时绑定邮箱和手机立即绑定

切换位顺序的快速方法?

切换位顺序的快速方法?

Go
牧羊人nacy 2021-10-04 17:19:19
我有一个这样的二进制文件10011011我的数据存储是这样的10,01,10,11,但我想这样重新排序11100110数据看起来像11,10,01,10。这个操作与ByteOrder转换相同,但在位级别。任何快速的 bitop 方法来做到这一点?目前,我必须将其解码为四个 int 然后合并为一个。
查看完整描述

2 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

您可以一步使用位掩码和位移位来完成它,而无需将其分解为 4 个不同的变量:


Go 解决方案(在Go Playground上尝试):


i := 0x9b // 10011011

fmt.Printf("%b\n", i)


i = (i&0x03)<<6 | (i&0x0c)<<2 | (i&0x30)>>2 | (i&0xc0)>>6

fmt.Printf("%b\n", i)

输出:


10011011

11100110

在 Java 中:


int i = 0x9b; // 10011011

System.out.printf("%x\n", i);


i = (i & 0x03) << 6 | (i & 0x0c) << 2 | (i & 0x30) >> 2 | (i & 0xc0) >> 6;

System.out.printf("%x\n", i);

输出(它是十六进制,但代表相同的数字):


9b

e6

由于每个位组(2 位组)都必须从输入中的原始位置移动,我认为您无法以更少的步骤(屏蔽和移位等步骤)来完成。如果这对您来说还不够快,那么加快速度的唯一选择是预先计算转换并将结果存储在@ruakh 的回答中详述的数组中。当然,如果我们允许超过 8 位,这将变得不可行。


查看完整回答
反对 回复 2021-10-04
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

最快的方法可能是预先计算所有值的表:


final int[] values = new int[256];

for (int i = 0; i < 256; ++i) {

    values[i] = (i & 0b1100_0000) >> 6

                | (i & 0b0011_0000) >> 2

                | (i & 0b0000_1100) << 2

                | (i & 0b0000_0011) << 6;

}

然后使用数组查找而不是位操作。


自然地,您会想要配置文件。


查看完整回答
反对 回复 2021-10-04
  • 2 回答
  • 0 关注
  • 247 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信