二进制值加起来不正确
Binary values don't add up correctly
我正在尝试用 C++ 编写 SHA-1 的实现。但出于某种原因,我无法让它工作。两个值不会正确相加。
我正在使用 this link 检查输入 test
的 SHA-1 的步骤
在函数的第一轮(对于单词 0)中,我有我的代码示例:
#define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c))))
a = 0xefcdab89;
b = 0x98badcfe;
c = 0x10325476;
d = 0xc3d2e1f0;
f = (b & c) | (d & (~b));
cout << LEFTROTATE(a, 5); // equal to 3903086636 (11101000101001000110000000101100)
cout << f; // equal to 2562383102 (10011000101110101101110011111110)
我希望这两个值相加得到 LEFTROTATE(a, 5) + f
,但我得到以下结果:
cout << LEFTROTATE(a, 5) + f; // equal to 2170502442 (10000001010111110011110100101010)
我期望输出为 6465469738 (110000001010111110011110100101010)
,因为 3903086636 + 2562383102 = 6465469738
。由于某种原因,该值降低了,我不知道为什么。
你的变量类型是什么?如果您使用 unsigned int
,它们会溢出。
考虑使用或转换为 unsigned long long
或 uint64_t
.
这是正常的,也是意料之中的。 SHA1 中使用的加法定义为加法模 232,这在添加 32 位位向量时自然发生。没有第33位所以不能设置
链接页面显示了一些额外的内容,但这基本上只是为了展示。它们不会影响结果,在那些额外的位有任何机会影响任何东西之前,它们会在该页面上被明确截断。
实际上,这些位本来就不存在,因为截断是隐式的。
我正在尝试用 C++ 编写 SHA-1 的实现。但出于某种原因,我无法让它工作。两个值不会正确相加。
我正在使用 this link 检查输入 test
在函数的第一轮(对于单词 0)中,我有我的代码示例:
#define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c))))
a = 0xefcdab89;
b = 0x98badcfe;
c = 0x10325476;
d = 0xc3d2e1f0;
f = (b & c) | (d & (~b));
cout << LEFTROTATE(a, 5); // equal to 3903086636 (11101000101001000110000000101100)
cout << f; // equal to 2562383102 (10011000101110101101110011111110)
我希望这两个值相加得到 LEFTROTATE(a, 5) + f
,但我得到以下结果:
cout << LEFTROTATE(a, 5) + f; // equal to 2170502442 (10000001010111110011110100101010)
我期望输出为 6465469738 (110000001010111110011110100101010)
,因为 3903086636 + 2562383102 = 6465469738
。由于某种原因,该值降低了,我不知道为什么。
你的变量类型是什么?如果您使用 unsigned int
,它们会溢出。
考虑使用或转换为 unsigned long long
或 uint64_t
.
这是正常的,也是意料之中的。 SHA1 中使用的加法定义为加法模 232,这在添加 32 位位向量时自然发生。没有第33位所以不能设置
链接页面显示了一些额外的内容,但这基本上只是为了展示。它们不会影响结果,在那些额外的位有任何机会影响任何东西之前,它们会在该页面上被明确截断。
实际上,这些位本来就不存在,因为截断是隐式的。