我正在尝试一个基本的Hash-Table程序...它将整数计为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;
}
可能是一个简单的逻辑...
答案 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];
}