128位整数乘法

时间:2015-09-02 18:05:52

标签: c performance memory

我在大学里接受了一项任务,用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;
        }

1 个答案:

答案 0 :(得分:3)

long long 在我使用的任何计算机上都不是128位类型。请参阅下面的参考资料我还假设通过&#34;最后一位&#34;你的意思是&#34;高位&#34;。此代码将用于在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,&#34;所有其他系统&#34;: 第13页,http://www.x86-64.org/documentation/abi.pdf