Java 的<< 和 >> 都是带符号移位。在不溢出的情况下,相当于乘以或除以2.在溢出的情况下,也就是符号位被移出,此时就会发生正数变负数,负数变正数的错误情况。
1<<31
1左移31位,此时变成只有符号位为1,其余为都为0,即80000000H。此时该值为int类型的最小数 -2147483648。
有三种写法:
(1<<31)-1 :即用最小的整数减去1,结果会溢出为最大的整数,此时内存状态为 7FFFFFFFFF,即为 2147483647。
(1<< -1) -1:同上,左移-1和左移31其实是一样的,因为会对32取余数,其实都是移动了31位。
-(1<<-1)-1 :左移-1位之后,变为最小整数,此时取相反数则变为 2147483648(其实内存中位状态没变),减一即为 2147483647。
a^=b;
b^=a;
a^=b;
推导过程如下:
a^=b;
b=a^b=a^b^b = a;
a=a^b = (a^b)^(a)=b;
首先对于n来说,有如下公式:
整数对 -1 异或,都相当于取相反数减一。n^(-1)=(-n)-1
n的相反数-n=~n+1
那么,对于公式,(n^(n>>31))-(n>>31),
当n>=0时,化简为 n^0-0=n。
当 n<0 时,化简为 n^(-1)-(-1)=n^(-1)+1 =(-n)-1+1=-n。
当 a>=b时,公式化简为 b&0 | a&(-1) = 0|a = a;
当 a<b 时,公式化简为 b&(-1) | a&0 = b|0 =b;
原理同 5.
原理:如果n位2的n次幂,则n内存分布肯定为 100000……,则n-1的分布为 11111111……。n&(n-1)肯定为0。
即相当于:if(x==a) x=b; if (x==b) x=a;
原文地址:http://blog.csdn.net/zq602316498/article/details/40586869