将非0改为-1 w / o条件的最快方法?

时间:2013-11-05 17:51:27

标签: numbers

不使用条件(if,loops,?:)将非0数字(1,-1,123)转换为所有位设置(-1或最高无符号数)的最快方式(最少循环量)是什么)?

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

2 个答案:

答案 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}}运算符可能有点难以理解,并且需要考虑一些微妙的细节......

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