uint64_t 的换档未按预期工作
Shifting with uint64_t not working as expected
作为一项更大任务的一部分,我被要求实现一个翻转整数中任意位的函数。问题是 "integer" 可以是 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;
}
此代码将 b
中的第 i
位与 1 异或,并将 b
中的其他位与 0 异或。这应该翻转第 i
位,同时剩下的保持不变。对此感到满意,我在所有这些不同的整数大小上测试了我的代码,然后将其上交。但是,我一定没有测试足够,因为我的代码在 int64_t 和 uint64_t 上都失败了。
我对 int64_t 和 uint64_t 做错了什么,我可以做些什么来使我的方法在不完全改变它的情况下起作用吗?
这个问题是由1的类型引起的,它是int(在合理的机器上是32位)。这意味着对大于或等于 32 的 i 值执行移位 (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;
}
作为一项更大任务的一部分,我被要求实现一个翻转整数中任意位的函数。问题是 "integer" 可以是 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;
}
此代码将 b
中的第 i
位与 1 异或,并将 b
中的其他位与 0 异或。这应该翻转第 i
位,同时剩下的保持不变。对此感到满意,我在所有这些不同的整数大小上测试了我的代码,然后将其上交。但是,我一定没有测试足够,因为我的代码在 int64_t 和 uint64_t 上都失败了。
我对 int64_t 和 uint64_t 做错了什么,我可以做些什么来使我的方法在不完全改变它的情况下起作用吗?
这个问题是由1的类型引起的,它是int(在合理的机器上是32位)。这意味着对大于或等于 32 的 i 值执行移位 (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;
}