对于大型任务的一部分,我被要求实现一个翻转整数任意位的函数。问题在于"整数"可以是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
位与1进行异或,b
中的其他位为0.这应该将i
位翻转,同时保留休息不变。对此感到满意,我在所有这些不同的整数大小上测试了我的代码,然后将其打开。但是,我必须测试不够,因为我的代码在int64_t和uint64_t都失败了。
我对int64_t和uint64_t做了什么错误,我能做些什么来让我的方法工作而不完全改变它?
答案 0 :(得分:5)
此问题是由类型1引起的,它是int(在合理的机器上有32位)。这意味着对于大于或等于32的i值执行shift (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;
}