我有一个 16 位整数,我正在尝试交换一些单独的位组件的值。
例如:
- 交换第 3 位和第 4 位的值。
- 交换第 5 位和第 6 位的值。
我还必须处理更复杂的价值转移链。
- 将第 2 位的值移动到第 3 位
- 将第 3 位的值移动到第 1 位
- 将第 1 位的值移动到第 4 位
- 将第 4 位的值移动到第 2 位。
有没有明智的方法来做到这一点?这些位并不总是相邻的,因此旋转似乎不是特别可行。现在,我能想到的就是逐位重建 int (通过连续的 &s + >>s),但这似乎并不是特别有效。
我现在有这个:
// bit 2 to bit 3
temp_shape = 0;
temp_shape = l_shape & NegXFace;
temp_shape >>= 1;
resultShape |= temp_shape;
// bit 3 to bit 1
temp_shape = 0;
temp_shape = l_shape & PosYFace;
temp_shape <<= 2;
resultShape |= temp_shape;
// bit 1 to bit 4
temp_shape = 0;
temp_shape = l_shape & PosXFace;
temp_shape >>= 2;
resultShape |= temp_shape;
// bit 4 to bit 2
temp_shape = 0;
temp_shape = l_shape & PosYFace;
temp_shape <<= 2;
resultShape |= temp_shape;
// bits 5 and 6
temp_shape = 0;
temp_shape = l_shape & (PosZFace | NegZFace);
resultShape |= temp_shape;