判断一个整数值是不是2的整数次方:
1 int PowerOfTwo(unsigned val) 2 { 3 return !(val & (val - 1)); 4 }
1 int const shift = sizeof(int)*8-1; 2 unsigned mask = (0x1<<shift); 3 if ( (a-b)&mask ) 4 max_num = b; 5 else 6 max_num = a;
int const shift = sizeof(int)*8-1;//shift仅仅在此通过初始化赋值(以后不能再赋值了),其值为int类型长度(以字节为单位)的8倍-1,比如假定int类型为32位(4个字节), 那么shift=31,假定int类型为16位(2个字节),那么shift=15,注意C编译器的不同实现里,int类型可能是16位的,也可能是32位的
unsigned mask = (0x1<<shift); //0x1<<shift就是把0x01左移15位或31位,也就是mask的最高位(也就是15号位或31号位)设置为1,其它位都设置为0.
if((a-b)&mask) max_num = b; //这里的a和b推断应该是int类型吧,(a-b)要么小于0(负数),要么不小于0(正数或0),(a-b)也是int类型的,int类型是有符号的类型,用 补码表示负数,最高位为1意味着这个数是负数。&运算是按位“与”运算,因为mask只有最高位是1,其它位全为0,这里的意思就是屏蔽掉(a-b)的其 它位,只看(a-b)的最高位,如果(a-b)的最高位为1(说明是负数),那么( (a-b)&mask ) 就不是0。注意if ( (a-b)&mask ) 是if (( (a-b)&mask )!=0)的简化写法,((a-b)&mask)不为0,就说明(a-b)的最高位是1,也就是说(a-b)是一个负数,也就是说,b大a小。
else max_num = a;
这段代码就是把a、b两个数中比较大的一个的值放到变量max_num中。