1

在不使用条件(如果、循环、?:) 的情况下,将非 0 数字(1、-1、123)转换为所有位集(-1 或最高无符号数)的最快方法是什么(最少的循环数)?

位大小是已知的。该解决方案应适用于 32 位和 64 位数字。

4

2 回答 2

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
于 2013-11-05T18:26:48.463 回答
0

在 C 中,给定一个非零数n!n应该产生 0,并且由于~0应该给出全一模式,所以~!n在大多数系统上,将任何非零数变为 -1。我认为它对 0 的作用,虽然是实现定义的 -!0经常是1,但我不记得这是否得到保证。C++ 应该是类似的,尽管在 anint nbool结果的类型转换!n和返回到运算int符之间的类型转换的复杂性~可能有点难以理解,并且需要考虑一些微妙的细节......

如果有疑问,请在您的编译器(或您关心的所有编译器 - 这不是一个特别难编写的测试用例)上尝试它。

于 2013-11-05T18:01:13.653 回答