作为较大任务的一部分,有人要求我实现一个函数,该函数可以将整数中的任意位翻转。问题是“整数”可以是c中从int8_t到uint64_t的任何默认整数类型,而我不知道它将是哪一个。 (实际上,我的代码已经在所有这些类型上进行了测试)

这是我尝试解决的问题:

//NOTE: g_int is the generic integer, it's typedef'd in a .h file
g_int flip_bit(g_int b, uint8_t i){
    //Code that makes sure i is a valid amount to shift by, there's a macro
    //that defines the upper bound of i in a .h file.
    g_int flipped = b ^ (1<<i);
    return flipped;
}

此代码将i中的b th位与1异或,并将b中的其他位与0异或。这应翻转i th位,而其余部分不变。对此感到满意,我在所有这些不同的整数大小上测试了我的代码,然后将其上交。但是,由于我的代码在int64_t和uint64_t上均失败,因此我必须做的测试不够。

我对int64_t和uint64_t做错了什么,是否可以做一些事情来使我的方法正常工作而无需完全更改它?

最佳答案

此问题是由1的类型引起的,该类型为int(在合理的计算机上为32位)。这意味着对i大于或等于32的值执行(1<<i)移位将导致不确定的行为。

只需在转换之前将1强制键入g_int即可解决此问题:

g_int flip_bit(g_int b, uint8_t i){
    g_int flipped = b ^ (((g_int)1)<<i);
    return flipped;
}

10-07 17:31