-1

bigintsへのビットシフトを実装しようとしています。BigIntは、2の補数の単一の整数Nビットとして解釈されるバイトの配列で表されます。だから私は次のようなものを作りたいです:

配列bigintの例:{0xFE、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF}は整数0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE(-2)N = 。

typedef unsigned char * BigInt;

私が自分のbigintimを作成しようとすると、エラーが発生します

#include <stdlib.h>

    void bi_init (int nbits)
    {
        nbytes = (nbits/8);
    }

    BigInt bi_new (int val)
    {
        BigInt new = (BigInt)malloc(nbytes*sizeof(unsigned char));

        new=val --> problem, can someone give me a hint on how can i implement this array?

        return novo;
    }
4

1 に答える 1

3
typedef unsigned char *BigInt;

BigInt *new = (BigInt)malloc(nbytes*sizeof(unsigned char));

newとして宣言しunsigned char**ます。これは、ポインターの1つのレベルが多すぎることです(mallocCでの結果をキャストしないでください)。

novonewが同じ変数であり、投稿に対して1つのオカレンスのみが翻訳されていると仮定すると、

novo = val

割り当てられたばかりのアドレスを渡されたアドレスで上書きしますval

割り当てられたバッファをのバイトで満たすにはval

int i = 0;
// make it unsigned, so that right-shifting works correctly
unsigned int u_val = val;
while(u_val) {
    new[i++] = u_val&0xFF;
    u_val >>= 8;
}

それから問題が残っています

nbytes = (nbits/8);

nbits8の倍数でない場合は、割り当てているメモリが少なすぎることを確認してください。

nbytes = (nbits+7)/8;
于 2012-09-24T20:13:06.010 に答える