我在阅读有关 DES 加密的内容时偶然发现了这段代码。我想知道它到底有什么作用?
我看到它根据最后一个 if 的结果返回 1 或 0。我还知道 mask 是十六进制的,十进制等于 128 (为什么是这个特定值?)。 for循环从0开始一直到pos%8,为什么呢? (我知道,例如如果 pos=14 那么 14%8=6)。
int bit_get(const unsigned char *bits, int pos)
{
unsigned char mask;
int i;
mask = 0x80;
for (i = 0; i < (pos % 8); i++)
mask = mask >> 1;
return (((mask & bits[(int)(pos / 8)]) == mask) ? 1 : 0);
}
谢谢!祝你有美好的一天:)
最佳答案
它从 8 位字符数组 pos
中获取第 bits
位(最高有效位 = 0)。
unsigned char
通常是 8 位长。因此,
bits[(int)(pos / 8)]
将首先提取所需位所在的八位字节。( pos
= 8 × pos/8
+ pos%8
)
然后我们从八位字节中获取实际位:
10111010
# 01234567
为了提取一点,我们使用“掩码”执行&
。 &
操作按位执行,如果两个操作数中的同一位都存在 1,则返回 1,否则返回 0,例如
10111010
& 11010001
= 10010000
因此,为了提取第 0 位,我们将 &
设为 10000000 = 0x80,将第 1 位设为 01000000 = 0x40,等等。循环是为了获取正确的掩码。
但 &
只给出 0x80、0x40 等或 0,而不是 1 或 0。最终条件
(mask & bits[...]) == mask) ? 1 : 0
执行将非零掩码转换为 1、将 0 转换为 0 的作业。
顺便说一句,通常我们会使用位移运算符 &
或 >>
来计算掩码。对于了解位运算的任何人来说,它都更高效、更清晰。
int bit_get(const uint8_t* bits, int pos) {
uint8_t mask = 1 << (7 - pos % 8);
return (bits[pos/8] & mask) ? 1 : 0;
}
关于c - C 函数 bit_get 在 DES 加密中起什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3935928/