1

私は基本的なハッシュテーブルプログラムを試しています..整数の1の数を数えます:

1の数が入った配列であるハッシュテーブルがあります0,1,2...E,F

HashTable:
0   0
1   1
2   1
3   2
4   1
5   1
6   2
7   3
8   1
9   2
A   2
B   3
C   2
D   3
E   3
F   4

ここで、整数から 8 つのニブルを抽出してarr[nibble-value]、各ニブルの 1 の数を取得できるようにします。

int arr[16] = {0,1,1,2,1,1,2,3,1,2,2,3,2,3,3,4};

int main (void)  
{
    int x = 127;
    int temp, sum =0, i;
    int nibbles = 2 * sizeof(x);
    for (i = 1; i<= nibbles; i++) 
    {
        temp = x << (4*i);   //  <<< I Know this is wrong!!!! <<Here is what I need!!>>
        printf("Temp[%d]:%d\n", i, temp);
        sum = sum + arr[temp];
    }
    printf("No.of ones: %d\n", sum);
    return 0;
}

単純な論理かもしれません...

4

4 に答える 4

3

配列インデックスとまったく同じように、最初のビットと最初のニブルの番号が 0 であることを思い出してください。したがって、ループを1開始することにより、実際には2 番目のニブルから開始し、整数を超えて最後のニブルを取得します。

また、間違った方向にシフトするため、上位ビットをマスクする必要があります。

for (i = 0; i< nibbles; i++) 
{
    temp = (x >> (4 * i)) & 0x0f;
    /* ... */
}
于 2012-08-30T07:12:13.333 に答える
2

変更は次の行にあります。temp = 0xF & (x >> i*4);

#include <stdio.h>

int arr[16] = {0,1,1,2,1,1,2,3,1,2,2,3,2,3,3,4};

int main (void)  
{
     int x = 127;
     int temp, sum =0, i;
     int nibbles = 2 * sizeof(x);
     for (i = 0; i<nibbles; i++) 
     {
         temp = 0xF & (x >> i*4); // I Know this is wrong!!!! <<Here is what I need!!>>
         printf("Temp[%d]:%d\n", i, temp);
         sum = sum + arr[temp];
     }
     printf("No.of ones: %d\n", sum);
     return 0;
}   
于 2012-08-30T07:12:39.193 に答える
1

場合によっては、既存の状態を変更して、ループの本体で行う作業を(一見)少なくする方が簡単な場合があります。

for (i = 0; i < nibbles; i++, x >>= 4) 
{
    temp = x & 0xf;
    /* ... */
}

上記はxループの反復ごとに変更されるため、次のニブルを抽出するには、各反復で最下位4ビットを取得する必要があります。これにより、半複雑なニブルマスキング式が切り取られ、コードが読みやすくなると考えられます。

于 2012-08-30T11:14:44.270 に答える
0

私はあなたが必要だと思います

for (i = 0; i<8; i++) 
{

     temp = (x>>(i*4)) & 0xF;
     printf("Temp[%d]:%d\n", i, temp);
     sum += arr[temp];
}
于 2012-08-30T07:24:03.633 に答える