【发布时间】:2015-05-14 21:04:20
【问题描述】:
static uint32_t get_num(void);
uint32_t get_count(unsigned int mask)
{
uint8_t i = 0;
uint32_t count = 0;
while (i < get_num())
{
if (mask & (1 << i++))
count++;
}
return count;
}
在这段代码中,(1L << i++) 或 (1UL << i++) 哪个更安全?
【问题讨论】:
-
get_num的范围是多少? -
为什么要把
i变成uint8_t? -
无。在表达式中使用副作用进行编程是邪恶的。
-
请参阅Bit Twiddling Hacks 了解对整数中设置的位进行计数的更好方法。
-
@chux:最好避免使用有符号整数进行右移,因为无论移位是有符号还是无符号,标准都明确地保持开放。这被编译器合法利用,因为并非所有 CPU 都签署了右移指令。
标签: c types type-conversion