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 位,这将变得不可行。
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;
}
然后使用数组查找而不是位操作。
自然地,您会想要配置文件。
- 2 回答
- 0 关注
- 247 浏览
添加回答
举报