在C ++中从无符号long long转换为unsigned int

时间:2016-06-15 19:49:59

标签: c++ c++11 hash

如果我在C / C ++中编写以下代码:

JFrame f = new JFrame();//make new JFrame
f.setVisible(true);

在转换为unsigned int时会丢弃哪些foo位?有什么方法可以强制只保留最低有效位吗?

或者,是否有一种简单的方法将foo散列为无符号的int大小? (这是首选,但我在初始化列表中执行所有这些操作。)

编辑:刚刚意识到保留最低有效位仍然可以允许循环。我觉得哈希是我当时的目标。

第二次编辑:为了澄清我在评论中回复的内容,我在循环中播种std :: default_random_engine并且不希望溢出导致种子值重复。我正在寻找一种简单的方法来将unsigned long long哈希到unsigned int。

4 个答案:

答案 0 :(得分:6)

C和C ++中无符号整数类型的算术通过模块化缩减处理超出范围的值;例如如果unsigned int是32位类型,那么当指定一个超出范围的值时,它会减少模2^32的值,并存储最小的非负代表。

特别是,这正是标准从较大的无符号整数类型分配时所要求的。

另请注意,标准不保证unsigned int的大小 - 例如,如果您需要一个绝对正好是32位宽的类型,请使用uint32_t

答案 1 :(得分:1)

回复编辑二中的问题,您可以根据开始时和需要种子之间的差异进行播种。 E.g:

std::default_random_engine generator;
typedef std::chrono::high_resolution_clock myclock;
myclock::time_point beginning = myclock::now();
for (int i = 0; i < 128; i++) // or whatever type of loop you're using
{
    // obtain a seed from the timer
    myclock::duration d = myclock::now() - beginning;
    unsigned seed = d.count();
    generator.seed(seed);
    // TODO: magic
}

答案 2 :(得分:1)

好消息你是安全的:

  1. 我刚刚跑了time.time_since_epoch().count()并得到了:
  2.   

    1465934400

    1. 你有一段时间直到你看到重复值,因为`numeric_limits是:
    2.   

      4294967295

      1. Copying to a integral type of a smaller size
      2.   

        导致多余的高阶位丢失

        因此,如果您只是做static_cast<unsigned int>(foo),那么您将无法获得大约136年的匹配输出:numeric_limits<unsigned int>::max / 60U / 60U / 24U / 356U

        PS如果你当时得到重复,你就不会在意。

答案 3 :(得分:1)

好的,我已决定使用std::hash

std::hash<long long> seeder;
auto seed = seeder(time.time_since_epoch().count());

由于我在初始化列表中执行此操作,因此可以将它放在一行中并传递给std::default_random_engine(但这看起来非常难看)。

这是对性能的打击,但至少它减少了种子重复的机会。