
int min(int x,int y){ return y + ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1)));} 提前致谢.
解决方法It is used to find the minimum of two numbers.
对于许多int组合来说,这个代码很不幸失败,因为它的价值非常低. @harold一个好的编译器会识别x<你? x:y;并生成正确和快速的代码. @David C. Rankin
确定它是如何工作的并不像它失败那样有趣.
>未定义的行为:如果x-y溢出,兼容的编译器可能会生成任何输出 – 甚至崩溃.优化编译器利用这一点使新程序员感到懊恼.
>移动符号位是实现定义的行为,如some_negative_int>> (sizeof(int)* CHAR_BIT – 1))). int的算术右移是常见的,但未由C指定.
> some_int>> (sizeof(int)* CHAR_BIT – 1)))如果int包含填充,则可以超过允许的最大移位(这很少见).
对于x,y的许多组合,OP的代码失败 – 121个测试案例中的31个失败 – 见下文. “It accomplishes this by an arithmetic shift”是实现定义的行为. x-y的潜在溢出是未定义的行为.如果不解决这些问题,任何答案都不完整
拐角情况“it works for any other sizes”通常是正确的,但罕见的平台可能在int中使用填充,使sizeof(int)* CHAR_BIT – 1成问题.
#include <stdio.h>int minz(int x,int y) { return y + ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1)));}voID testmin(int x,int y) { static unsigned count = 0; static unsigned fail = 0; int min0 = x < y ? x: y; int min1 = minz(x,y); count++; if (min0 != min1) { faiL++; printf("%u/%u min(%d,%d)--> %d,should be %d\n",fail,count,x,y,min1,min0); }}int main(voID) { const int i[]={INT_MIN,INT_MIN+1,INT_MIN+2,-2,-1,1,2,INT_MAX-2,INT_MAX-1,INT_MAX}; int x,y; for (x=0; x<sizeof i/sizeof i[0]; x++) { for (y=0; y<sizeof i/sizeof i[0]; y++) { testmin(i[x],i[y]); } }} 输出(故障)
1/7 min(-2147483648,1)--> 1,should be -21474836482/8 min(-2147483648,2)--> 2,should be -21474836483/9 min(-2147483648,2147483645)--> 2147483645,should be -21474836484/10 min(-2147483648,2147483646)--> 2147483646,should be -21474836485/11 min(-2147483648,2147483647)--> 2147483647,should be -21474836486/19 min(-2147483647,should be -21474836477/20 min(-2147483647,should be -21474836478/21 min(-2147483647,should be -21474836479/22 min(-2147483647,should be -214748364710/31 min(-2147483646,should be -214748364611/32 min(-2147483646,should be -214748364612/33 min(-2147483646,should be -214748364613/44 min(-2,should be -214/56 min(0,-2147483648)--> 0,should be -214748364815/67 min(1,-2147483648)--> 1,should be -214748364816/68 min(1,-2147483647)--> 1,should be -214748364717/78 min(2,-2147483648)--> 2,should be -214748364818/79 min(2,-2147483647)--> 2,should be -214748364719/80 min(2,-2147483646)--> 2,should be -214748364620/89 min(2147483645,-2147483648)--> 2147483645,should be -214748364821/90 min(2147483645,-2147483647)--> 2147483645,should be -214748364722/91 min(2147483645,-2147483646)--> 2147483645,should be -214748364623/100 min(2147483646,-2147483648)--> 2147483646,should be -214748364824/101 min(2147483646,-2147483647)--> 2147483646,should be -214748364725/102 min(2147483646,-2147483646)--> 2147483646,should be -214748364626/103 min(2147483646,-2)--> 2147483646,should be -227/111 min(2147483647,-2147483648)--> 2147483647,should be -214748364828/112 min(2147483647,-2147483647)--> 2147483647,should be -214748364729/113 min(2147483647,-2147483646)--> 2147483647,should be -214748364630/114 min(2147483647,-2)--> 2147483647,should be -231/115 min(2147483647,-1)--> 2147483647,should be -1总结
以上是内存溢出为你收集整理的c – 使用位 *** 作查找最小值全部内容,希望文章能够帮你解决c – 使用位 *** 作查找最小值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)