如果我在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。
答案 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)
好消息你是安全的:
time.time_since_epoch().count()
并得到了:1465934400
4294967295
导致多余的高阶位丢失
因此,如果您只是做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
(但这看起来非常难看)。
这是对性能的打击,但至少它减少了种子重复的机会。