0

文字の 64*64 サイズのアダマール行列を作成しました。行列の各行のバイナリ値 (つまり、64 ビットの 2 進数) を配列に渡したいと思います (ルックアップ)。これを行うコードは、メイン関数の下部にある double for ループです。

ここでコードを使用すると、完全なバイナリ値ではなく、1 のリストが出力されます。

#include <stdio.h>
#include <stdlib.h>

void create_hadamard_matrix(char** h, int N)
{
    int ind,indr,indc;

    for (ind=1;ind<=N;ind*=2)
    {

        // find the half length of H matrix for this iteration
        int sideHalf=ind/2;

        //for n=1 H matrix
        if (ind==1)
        {
            h[0][0]='1';
        }
        else
        {
            //put in values in bottom left of new H matrix
            for (indr=0; indr<sideHalf; indr++)
            {
                for (indc=0; indc<sideHalf; indc++)
                {
                    h[indr+sideHalf][indc]=h[indr][indc];
                }
            }
            //put in values in top right of new H matrix
            for (indr=0; indr<sideHalf; indr++)
            {
                for (indc=0; indc<sideHalf; indc++)
                {
                    h[indr][indc+sideHalf]=h[indr][indc];
                }
            }
            //put in values in bottom right of new H matrix
            for (indr=0; indr<sideHalf; indr++)
            {
                for (indc=0; indc<sideHalf; indc++)
                {
                    //invert characters
                    if (h[indr][indc]=='1')
                    {
                        h[indr+sideHalf][indc+sideHalf]='0';
                    }
                    else
                    {
                        h[indr+sideHalf][indc+sideHalf]='1';
                    }

                }
            }
        }
    }
}


void main()
{
    int i,j,N=64;

    char **h = (char**) malloc(N  * sizeof(char*));
    for ( i = 0; i < N; i++ )
    {
        h[i] = (char*) malloc(N  * sizeof(char));
    }

    create_hadamard_matrix(h, N);

    unsigned long long *lookup = (unsigned long long*) malloc(N * sizeof(unsigned long long));

    for (i=0; i<N; i++)
    {
        for (j=0; j<N; j++)
        {
            if (h[i][j]=='1')
            {
                lookup[i]=(1<<(63-j));
            }   

        }
        printf("%llu",lookup[i]);   
        printf("\n");
    }
}
4

1 に答える 1

5

(これは, btwmain()を返す必要があります) で、これを変更します。int

if (h[i][j]='1');

これに:

if (h[i][j]=='1')

できれば明白な理由から。


次に、割り当て後にルックアップ配列が初期化されていません (その必要はないと思うかもしれませんが、この後の次のエラー修正が機能するために必要です)。

これを変える:

unsigned long long *lookup = (unsigned long long*) malloc(N * sizeof(unsigned long long));

これに:

unsigned long long *lookup = calloc(N, sizeof(*lookup));

これにより、開始時にルックアップ配列がゼロで埋められます。あなたがmemset望むなら、あなたもできます。選択はあなた次第です。


次に、複数ビットの各行の参照値を上書きします。つまり、行のルックアップ エントリに書き込む最後のビットだけが保存されます。|=だけでなく、それらを使用してそれらを蓄積する必要があります=。また、シフト操作が ulonglong で行われることを確認する必要があります。書かれているように、それは幅intをはるかに超えてシフトしています。int下記参照。

これを変える:

lookup[i]=(1<<(63-j));

これに:

lookup[i]|=(((unsigned long long)1)<<(63-j));

すべてをまとめて、私が叩きつけたばかりのビットプリンターを使用すると、これが得られます。

1111111111111111111111111111111111111111111111111111111111111111
1010101010101010101010101010101010101010101010101010101010101010
1100110011001100110011001100110011001100110011001100110011001100
1001100110011001100110011001100110011001100110011001100110011001
1111000011110000111100001111000011110000111100001111000011110000
1010010110100101101001011010010110100101101001011010010110100101
1100001111000011110000111100001111000011110000111100001111000011
1001011010010110100101101001011010010110100101101001011010010110
1111111100000000111111110000000011111111000000001111111100000000
1010101001010101101010100101010110101010010101011010101001010101
1100110000110011110011000011001111001100001100111100110000110011
1001100101100110100110010110011010011001011001101001100101100110
1111000000001111111100000000111111110000000011111111000000001111
1010010101011010101001010101101010100101010110101010010101011010
1100001100111100110000110011110011000011001111001100001100111100
1001011001101001100101100110100110010110011010011001011001101001
1111111111111111000000000000000011111111111111110000000000000000
1010101010101010010101010101010110101010101010100101010101010101
1100110011001100001100110011001111001100110011000011001100110011
1001100110011001011001100110011010011001100110010110011001100110
1111000011110000000011110000111111110000111100000000111100001111
1010010110100101010110100101101010100101101001010101101001011010
1100001111000011001111000011110011000011110000110011110000111100
1001011010010110011010010110100110010110100101100110100101101001
1111111100000000000000001111111111111111000000000000000011111111
1010101001010101010101011010101010101010010101010101010110101010
1100110000110011001100111100110011001100001100110011001111001100
1001100101100110011001101001100110011001011001100110011010011001
1111000000001111000011111111000011110000000011110000111111110000
1010010101011010010110101010010110100101010110100101101010100101
1100001100111100001111001100001111000011001111000011110011000011
1001011001101001011010011001011010010110011010010110100110010110
1111111111111111111111111111111100000000000000000000000000000000
1010101010101010101010101010101001010101010101010101010101010101
1100110011001100110011001100110000110011001100110011001100110011
1001100110011001100110011001100101100110011001100110011001100110
1111000011110000111100001111000000001111000011110000111100001111
1010010110100101101001011010010101011010010110100101101001011010
1100001111000011110000111100001100111100001111000011110000111100
1001011010010110100101101001011001101001011010010110100101101001
1111111100000000111111110000000000000000111111110000000011111111
1010101001010101101010100101010101010101101010100101010110101010
1100110000110011110011000011001100110011110011000011001111001100
1001100101100110100110010110011001100110100110010110011010011001
1111000000001111111100000000111100001111111100000000111111110000
1010010101011010101001010101101001011010101001010101101010100101
1100001100111100110000110011110000111100110000110011110011000011
1001011001101001100101100110100101101001100101100110100110010110
1111111111111111000000000000000000000000000000001111111111111111
1010101010101010010101010101010101010101010101011010101010101010
1100110011001100001100110011001100110011001100111100110011001100
1001100110011001011001100110011001100110011001101001100110011001
1111000011110000000011110000111100001111000011111111000011110000
1010010110100101010110100101101001011010010110101010010110100101
1100001111000011001111000011110000111100001111001100001111000011
1001011010010110011010010110100101101001011010011001011010010110
1111111100000000000000001111111100000000111111111111111100000000
1010101001010101010101011010101001010101101010101010101001010101
1100110000110011001100111100110000110011110011001100110000110011
1001100101100110011001101001100101100110100110011001100101100110
1111000000001111000011111111000000001111111100001111000000001111
1010010101011010010110101010010101011010101001011010010101011010
1100001100111100001111001100001100111100110000111100001100111100
1001011001101001011010011001011001101001100101101001011001101001

うまくいけば、それがそのように見えるはずです(正直なところ、私には手がかりがありません)。

于 2013-09-04T05:59:26.063 に答える