【发布时间】:2026-02-16 04:10:01
【问题描述】:
我在大学的任务是用 C 语言计算 2 个 128 位整数的乘积并返回旧的 64 位。随意使用下面的代码打印出 128 位整数乘积的低 128 位。
更新!!!
我的老师突然说他打算打印旧的 64 位。我决定使用char * 存储所有 128 位并将乘法结果打印为 128 个低位。下面的代码有效:
#include <stdio.h>
#include <stdlib.h>
char *moveBit(char *s){ // moves the binary string one bit to the left (like s<<1 operation)
char bit='0';
char temp='0';
for(int i=127;i>=0;i--){
temp = s[i];
s[i]=bit;
bit=temp;
}
return s;
}
char *bitSum(char *a, char *b){ // figures out the sum of two numbers bit by bit
char rem = '0';
char* sum = (char *) malloc(129);
for(int i=127;i>=0;i--){
int s = (a[i]=='1') + (b[i]=='1') + (rem=='1');
if (s==3){
sum[i]='1';
rem='1';
}else if(s==2){
sum[i]='0';
rem='1';
}else{
sum[i] = s? '1':'0';
rem='0';
}
}
return sum;
}
char *mult(char *a, char *b){
char* product = (char *) malloc(129);
for(int i=127;i>=0;i--){
if(b[i]=='1')
product = bitSum(product,a);
a=moveBit(a);
}
return product;
}
int main(){
char *a = (char *) malloc(129);
char *b = (char *) malloc(129);
a="01111111111111111111111111111111101010001101100110100000011111111111111111111111111111111111111111111111111110111111001111111111";
b="01111111111111111111111111111111111111111111110111111001111111111111111111111111111111111111111111111111111111011111100111111111";
printf("%s", mult(a,b));
return 0;
}
【问题讨论】:
-
你确定它们是指“最后”的最低 64 位吗?这将使它成为一个微不足道的问题(只需将低部分乘以
uint64_t)。我会认为大部分时间都是“第一”部分。 -
在实际情况下,您将使用en.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library。然而这是家庭作业,所以你需要自己做——作弊会让你被开除。
-
如果你倾倒除了 l.s. 之外的所有东西。那么你需要使用无符号。
-
如果你定义了一个掩码,你的代码使用
long long int cutter = 0x7fffffffffffffffLL会更易读 -
也许您应该将每个 64 位被乘数分解为两个 32 位部分(在丢弃 128 位输入的高 64 位之后,这似乎无关紧要) ,然后“手动”进行长乘法。也就是说,计算四个 32×32 到 64 位的乘积,并弄清楚如何将它们重新组合成您需要的结果。 (提示:其中一种产品可以扔掉。)
标签: c performance memory