【问题标题】:When you divide a hexadecimal, what do you get?当你除以十六进制时,你会得到什么?
【发布时间】:2015-02-27 20:42:45
【问题描述】:

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

输入文件包含如下行:

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);
}

【问题讨论】:

  • 您的问题没有意义,hex 或 decimal 之间没有区别,除了表示最终将是 二进制,想想这个int x = 0x04; int y = x / 2; printf("%d\n", y);输出是什么?
  • @iharob 但可以说我有 "7f1a91027130" ,我不确定将它除以某个数字会得到什么。
  • 它会给你数学除法的结果,我想..
  • 对不起,如果我感到困惑,我正在学习计算机体系结构,这不是家庭作业,但我只是想弄清楚这实际上是如何工作的。
  • 如果我想为此创建一个哈希函数,我希望输出小于 1000。那么我如何判断该十六进制除以某个数字是否会小于 1000?这就是我试图弄清楚我无法通过查看来判断的原因

标签: c hex


【解决方案1】:

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

让我们看一下100这个数字。我们可以将其以十进制形式打印为100。同样,我们可以将其以八进制打印为0144。我们可以将其以十六进制打印为0x64。

但所有三个都代表相同的数字。所以100 / 3、0144 / 3和0x64 / 3的结果都是相同的。

关于你真正的问题......

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

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

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

【讨论】:

  • 输入也一样。该文件包含十六进制数字,但一旦读取到变量,它们在内部与所有其他表示它们以供人类使用的方式相同。
  • 也许将“打印到屏幕”和“打印”改为“表示”?
  • 我认为他的意思是十进制的 1000
  • @gio:我愿意相信有人能读懂这篇文章,并且能够将0x1000 替换为任意数字,并且理解0x1000 并不特殊。
  • @BillLynch:是的,你是对的,虽然这有点令人困惑,但他似乎只是想知道如何获取 [0,1000) 范围内的数字——他甚至不需要发布代码
【解决方案2】:

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

十六进制 0x3e8 = 1000 年 12 月。

【讨论】:

  • 在 C 中,您需要在这些数字前面加上“0x”。特别是 3e8,前面没有 0x,将被解释为 double = 3.0 * 10^8。
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 2020-03-04
  • 1970-01-01
  • 2021-04-17
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多