gpt4 book ai didi

c - C函数bit_get在DES加密中的作用是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 02:18:39 24 4
gpt4 key购买 nike

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

我看到它根据最后一个 if 的结果返回 1 或 0。我也知道掩码是十六进制的,十进制等于 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 进行 &,并使用 01000000 = 0x40 等对第 1 位进行 & 等。循环是为了获得正确的掩码。

& 只给出 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com