当你划分十六进制时,你会得到什么?

时间:2015-02-27 20:42:45

标签: c hex

我正在尝试创建一个存储十六进制的哈希函数,但我不确定哈希函数是什么。我从文本文件中获取十六进制的地址,然后将它们转换为unsigned long long int。我正在尝试创建一个大小为1000的哈希表,那么当我划分这些长期的整数时,我究竟能得到什么呢?我不太明白这一点。

输入文件包含以下行:

0x7f1a91026b00
0x7f1a91026b03
0x7f1a91027130
0x7f1a91027131
0x7f1a91027134
0x7f1a91027136

到目前为止这是我的代码(由于我没有哈希函数,我此刻没有创建哈希表)

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

int main (int argc, char **argv){

    if(argc!=2){
        printf("error\n");
        return 0;
        // if there is no input then print an error
    }

    FILE *file = fopen(argv[1], "r"); // open file

    if (!file){
        printf("error\n");
        return 0;
    }

    char linestring[BUFSIZ];

    while (fgets(linestring, sizeof(linestring), file)) // reads the entire file until it hits Null
    {
        char *endptr;
        unsigned long long key = strtoull(linestring, &endptr, 16);

        printf("%s\n", linestring);
    }

    fclose(file);
}

2 个答案:

答案 0 :(得分:3)

十六进制,十进制和八进制只是打印到屏幕的三种不同方式相同的数字。

让我们看看数字 100 。我们可以用十进制打印它100。同样,我们可以将其作为0144以八进制打印。我们可以用十六进制打印它0x64

但这三个代表相同的数字。因此,100 / 30144 / 30x64 / 3的结果都相同

在您真正的问题上......

您有一个号码x。您希望将x限制为[0, 0x1000)之间的数字。最简单的方法是:

unsigned long long x;
unsigned long long y = x % 0x1000;

现在y将在[0, 0x1000)范围内。这基本上是通过从0x1000中减去x直到它小于0x1000来实现的。

答案 1 :(得分:0)

因此,如果您希望哈希表大小为1000,那么您需要获得0x3E8的模数,例如0x7f1a91026b00%0x3e8 = 0x20。这代表十二月的32。

Hex 0x3e8 = Dec 1000。