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

请记住,第一位编号为零,第一个半字节也是如此,就像数组索引一样。因此,通过从1你开始循环实际上从第二个半字节开始,并从整数之外获取最后一个半字节。

此外,您朝错误的方向移动,并且应该掩盖最高位,即

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内容在每次循环迭代时都会进行修改,因此要提取下一个半字节,我们只需要在每次迭代中获取四个最低有效位。这消除了半复杂的半字节掩码表达式,这可能被认为使代码更易于阅读。

于 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 回答