有什么方法可以在C中提取整数(假设是32位整数)的8个半字节?

时间:2012-08-30 07:00:28

标签: c bitwise-operators bit-shift

我正在尝试一个基本的Hash-Table程序...它将整数计为1的数:

我有一个哈希表,它是0,1,2...E,F

中数字为1的数组
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 个答案:

答案 0 :(得分:3)

请记住,第一位编号为零,第一个半字节也是如此,与数组索引完全相同。因此,通过从1开始循环,您实际上从第二个半字节开始,并从中获取最后一个半字节整数。

此外,您向错误的方向移动,并应掩盖顶部位,即执行

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

答案 1 :(得分: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;
}   

答案 2 :(得分:1)

有时,修改现有状态并在循环体中做更少(貌似)工作更容易:

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

以上修改了每个循环迭代的x,因此要提取下一个半字节,我们只需要在每次迭代时获取四个最低有效位。这样可以减少半复杂的半字节掩码表达式,可以考虑使代码更容易阅读。

答案 3 :(得分:0)

我认为你需要

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

     temp = (x>>(i*4)) & 0xF;
     printf("Temp[%d]:%d\n", i, temp);
     sum += arr[temp];
}