C函数位在DES加密中起什么作用?

C函数位在DES加密中起什么作用?,c,function,encryption,C,Function,Encryption,我在阅读DES加密时偶然发现了这段代码。我想知道它到底做什么 我看到它根据最后一个if的结果返回1或0。我也知道掩码是十六进制的,十进制等于128(为什么是这个特定的值?)。for循环从0开始直到位置%8,为什么?(我知道,例如,如果pos=14,那么14%8=6) int位(常量无符号字符*位,int位) { 无符号字符掩码; int i; 掩码=0x80; 对于(i=0;i>1; 返回(((掩码和位[(int)(pos/8)])==掩码)?1:0; } 谢谢大家!!祝您愉快:)它从8位字符

我在阅读DES加密时偶然发现了这段代码。我想知道它到底做什么

我看到它根据最后一个if的结果返回1或0。我也知道掩码是十六进制的,十进制等于128(为什么是这个特定的值?)。for循环从0开始直到位置%8,为什么?(我知道,例如,如果pos=14,那么14%8=6)

int位(常量无符号字符*位,int位)
{
无符号字符掩码;
int i;
掩码=0x80;
对于(i=0;i<(位置%8);i++)
掩码=掩码>>1;
返回(((掩码和位[(int)(pos/8)])==掩码)?1:0;
}

谢谢大家!!祝您愉快:)

它从8位字符数组
中获取第位(最高有效位=第0位)

通常,
无符号字符的长度为8位。因此,

bits[(int)(pos / 8)]
将首先提取所需位所在的八位字节。(
pos
=8×
pos/8
+
pos%8

然后我们从八位字节中得到实际的位:

  10111010
# 01234567
为了提取位,我们使用“掩码”执行
&
。操作
&
按位执行,如果两个操作数的同一位中都有1,则返回1,否则返回0,例如

  10111010
& 11010001
= 10010000
因此,为了提取第0位,我们使用10000000=0x80的
&
,使用01000000=0x40的第1位
&
,等等。循环是为了获得正确的掩码

但是
&
只给出0x80、0x40等或0,而不是1或0。最后的条件

(mask & bits[...]) == mask) ? 1 : 0
执行将非零掩码转换为1以及将0转换为0的作业



顺便说一句,通常我们会使用位移位运算符
>
,我不知道他为什么不直接执行
掩码>>(位置%8)
,而不是循环


0x80
是二进制的
10000000
,这意味着您首先屏蔽掉最重要的位,因为它是唯一一个带有
1

的位。我想知道为什么要使用
for
循环,而不仅仅是
mask>=(位置%8)
@不变量:我猜这是用一些嵌入的(可能是8位)编写的芯片和编译器,当在脑海中输入错误代码时会生成错误代码。可能是通过坚持将内容转换为更大的类型(更多的代码和更多的寄存器)或对大于1或2的移位执行函数调用(MSP430的IAR实现了这一点,但它是16位的)。
(mask & bits[...]) == mask) ? 1 : 0
int bit_get(const uint8_t* bits, int pos) {
    uint8_t mask = 1 << (7 - pos % 8);
    return (bits[pos/8] & mask) ? 1 : 0;
}