好的,首先,我们将尝试将 3 个字节放入一个整数中。我们将使用移位和OR
逻辑。假设我们有a
,b
和c
输入变量。(Uof
将分别拆分为a
,b
和c
)。
我们首先为b
变量增加 1 个字节的空间:
(b << 8)
所以01101111
转化为0110111100000000
。
现在我们OR
c
进入b
,所以零实际上是c
:
((b << 8) | c))
现在,我们对a
. 我们在 的右边保留了更多的 16 位a
,所以我们可以OR
得到最后一个表达式。
((a << 16) | ((b << 8) | c))
到目前为止,我们已将所有位合并为一个 4 字节整数。
我们现在只需要将它分成 4 个部分,每个部分 6 位。我们将为此使用掩码逻辑。
首先,当我们使用“掩码”逻辑时,我们必须自己制作掩码。我们的掩码是0x3F
(取自二进制数111111,即6位),所以当我们AND
数的时候,有了这个掩码,我们就可以提取出右边的前6位:
r1 = (merged & 0x00003F);
代表r1
什么result 1
。
现在,同样的事情,但合并后的数字向右 6 位,所以我们可以取下一个 6 位数字,以此类推:
r1 = ((merged >> 0) & 0x3F);
r2 = ((merged >> 6) & 0x3F);
r3 = ((merged >> 12) & 0x3F);
r4 = ((merged >> 18) & 0x3F);
因此,最终代码将是:
char /*or int*/ a, b, c;
int merged, r1, r2, r3, r4;
scanf(" %c %c %c", &a, &b, &c);
merged = ((a << 16) | ((b << 8) | c));
r1 = ((merged >> 0) & 0x3F);
r2 = ((merged >> 6) & 0x3F);
r3 = ((merged >> 12) & 0x3F);
r4 = ((merged >> 18) & 0x3F);
printf("%d %d %d %d\n", r1, r2, r3, r4);
编辑:我已经更正了面具部分。