在大学里,我被赋予一项任务,用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;
}
最佳答案
long long 不是我使用过的任何计算机上的128位类型。请参阅下面的参考。我还假设“最后几位”是指“高位”。这段代码可以使GCC上进行无符号的128位算术运算(调整编译器的类型名称):
#include <stdint.h>
#include <stdio.h>
int main () {
__uint128_t x = 9223372036146775308;
__uint128_t y = 9223372036854709503;
__uint128_t prod = x * y;
uint64_t high = prod >> 64;
printf("%lu\n", high);
}
我的机器上的类型多长时间?
视窗:
https://msdn.microsoft.com/en-us/library/94z15h2c.aspx
Linux,Mac OSX,“所有其他系统”:
第13页,http://www.x86-64.org/documentation/abi.pdf