不使用条件(if,loops,?:)将非0数字(1,-1,123)转换为所有位设置(-1或最高无符号数)的最快方式(最少循环量)是什么)?
比特度是已知的。解决方案应该适用于32位和64位数字。
答案 0 :(得分:2)
这应该这样做。
#include <stdio.h>
int
foo(int j)
{
return ((~j + 1) | (-1 & j)) >> ((sizeof(char *) * 8) - 1);
}
int
main()
{
int r, j;
j = 0;
r = foo(j);
printf("j = %d, r = %d\n", j, r);
j = -1;
r = foo(j);
printf("j = %d, r = %d\n", j, r);
j = 123;
r = foo(j);
printf("j = %d, r = %d\n", j, r);
return(0);
}
运行它会导致
j = 0, r = 0
j = -1, r = -1
j = 123, r = -1
答案 1 :(得分:0)
在C中,给定非零数字n
,!n
应该产生0,并且由于~0
应该给出全1模式,~!n
将会,大多数系统将任何非零数字转换为-1。我认为它对0的作用虽然是实现定义的 - !0
经常是1
,但我不记得是否有保证。 C ++应该是类似的,尽管int
n
bool
!n
结果int
和~
{{1}}之间类型转换的复杂性很复杂1}}运算符可能有点难以理解,并且需要考虑一些微妙的细节......
如果有疑问,请在您的编译器(或您关注的所有编译器)上进行尝试 - 这不是一个特别难以编写的测试用例。