在不使用条件(如果、循环、?:) 的情况下,将非 0 数字(1、-1、123)转换为所有位集(-1 或最高无符号数)的最快方法是什么(最少的循环数)?
位大小是已知的。该解决方案应适用于 32 位和 64 位数字。
在不使用条件(如果、循环、?:) 的情况下,将非 0 数字(1、-1、123)转换为所有位集(-1 或最高无符号数)的最快方法是什么(最少的循环数)?
位大小是已知的。该解决方案应适用于 32 位和 64 位数字。
这应该这样做。
#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
在 C 中,给定一个非零数n
,!n
应该产生 0,并且由于~0
应该给出全一模式,所以~!n
在大多数系统上,将任何非零数变为 -1。我认为它对 0 的作用,虽然是实现定义的 -!0
经常是1
,但我不记得这是否得到保证。C++ 应该是类似的,尽管在 anint
n
到bool
结果的类型转换!n
和返回到运算int
符之间的类型转换的复杂性~
可能有点难以理解,并且需要考虑一些微妙的细节......
如果有疑问,请在您的编译器(或您关心的所有编译器 - 这不是一个特别难编写的测试用例)上尝试它。