有两个变量 a 和 b,不用 "if" , "?:", "switch" 或其它判断语句,找出两个数中较大的。
方法一:
[C++] 纯文本查看 复制代码 int max = ( (a + b) + abs(a - b) ) / 2;
方法二:
[C++] 纯文本查看 复制代码 int c = a - b;
char *strs[2] = {"a Large ", "b Large "};
c = (unsigned)c >> (sizeof(int) * 8 - 1);
printf ("%s\\n", strs[c]);
上面的方法,通过判断最高位(第 31 位,符号位)来判断减法结果是正数还是负数,如果最高位为 1,那么计算结果是负数,说明 b 大于 a ;反之则 a > b 。
这里需要注意的是,(unsigned) 强制类型转换不能少,否则当 c 为负数时,用的是 sar 汇编指令进行移位,sar 指令会根据整数的符号位要么清空,要么置位移位造成的空位,所以这样一来,当 c 为负数时,使用 strs[c] 时就会产生错误,因为数组下标不可能是个负数,也就是数组下标被认为是 0xFFFFFFF4 这样的无符号整数时也是越界的。
当使用 unsigned 进行类型的强制转换后,汇编指令用的是 shr 指令进行移位,该指令针对无符号整数的移位操作。 |