C函数位在DES加密中起什么作用?
我在阅读DES加密时偶然发现了这段代码。我想知道它到底做什么 我看到它根据最后一个if的结果返回1或0。我也知道掩码是十六进制的,十进制等于128(为什么是这个特定的值?)。for循环从0开始直到位置%8,为什么?(我知道,例如,如果pos=14,那么14%8=6)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位字符
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;
}