位运算:? & ?与运算 都是1 才等于1 其他都是0 ?| ? 或运算 ?有1 为1 ?其他都是0? ^ ?异或运算 ?相通为0 不同为1 << 向左移动 >> 向右移动 ~ ?取反 一、打印int的32位 ?for(int i=31;i>=0;i--) ?System.out.print((num&(1<<i))==0?"0":"1"); ?使用位运算 & ?<<? ?int num=1; num & 1<<31 向左移动31位 然后与1 与完 ?得到31位为0? 10000000000000000000000000000000 00000000000000000000000000000001 num & 1<<30 向左移动30位 然后与1 与完 ?得到30位为0? 01000000000000000000000000000000 00000000000000000000000000000001 以此类推 。。。。。。 num & 1<<2 向左移动2位 然后与1 与完 ?得到2位为0? 00000000000000000000000000000100 00000000000000000000000000000001 num & 1<<1 向左移动1位 然后与1 与完 ?得到1位为0? 00000000000000000000000000000010 00000000000000000000000000000001 num & 1<<0 向左移动0位 然后与1 与完 ?得到0位为1? 00000000000000000000000000000001 00000000000000000000000000000001
所以得到的二进制结果就是 00000000000000000000000000000001
0000 0000 0000 0000 0000 0000 0000 0001= 2的0次方=1 2(31次方) 2(20次方)....................2(4次方), 2(3次方),2(2次方),2(1次方),2(0次方) ? 0000 0000 0000 0000 0000 0000 0000 0010= 2的1次方=2 0000 0000 0000 0000 0000 0000 0000 0011= 2的1次方+2的0次方=3 0000 0000 0000 0000 0000 0000 0000 0100= 2的2次方=4 0000 0000 0000 0000 0000 0000 0000 0101= 2的2次方+2的0次方=5 0000 0000 0000 0000 0000 0000 0000 0110= 2的2次方+2的1次方=6 以此类推 ........ 最大 0111 1111 1111 1111 1111 1111 1111 1111= 2的31次方-1=Integer.max_value; 定格31为是作为符号 ?如果是0 ?表示非负 ?如果是1 表示 负数
~ 反码 int a=100 ?; ?int b=(~a+1)? 1是二进制的加1? 那b==-100
顶格是1 表示负数 1111 1111 1111 1111 1111 1111 1111 1111= 除了顶个的1 其他的取反 1000 0000 0000 0000 ?0000 0000 0000 0000 ?然后+1 =1000 0000 0000 0000 ?0000 0000 0000 0001=2的0次方=-1
1111 1111 1111 1111 1111 1111 1111 1110 = 除了顶个的1 其他的取反 1000 0000 0000 0000 ?0000 0000 0000 0001 然后加+1=1000 0000 0000 0000 ?0000 0000 0000 0010=2的1次方=-2
以此类推 .... 最小(-2147483648) 1000 0000 0000 0000 ?0000 0000 0000 0000 =除了顶个的1 其他的取反 1111 1111 1111 1111 1111 1111 1111 1111 然后加+1=1000 0000 0000 0000 ?0000 0000 0000 0000=2的31次方 -2147483648 不管符号
或运算 | ?有1就为1 其他都是0
举例 ?2个数字相加的底层算法 比如 1+9
1的32位是 0000 0000 0000 0000 0000 0000 0000 0001 9的32位是 0000 0000 0000 0000 0000 0000 0000 1001
得到的结果是 2个相加 都是1 前进一位1 当前变成0? 0000 0000 0000 0000 0000 0000 0000 1010=2的3次方+2的1次方=8+2=10
异或 ^ ?相同为0 ?不同为1
00000000000000011110001001000000 00000000000010011111101111110001
00000000000010000001100110110001
>>> 向右移 ?不带符号向右移 >> 带符号向右移 ? printCode(Integer.MIN_VALUE); printCode(Integer.MIN_VALUE>>>1);//不带符号向右移 printCode(Integer.MIN_VALUE>>1);//带符号向右移 10000000000000000000000000000000 01000000000000000000000000000000//不带符号向右移 11000000000000000000000000000000//带符号向右移
取反+1 ?加的是二进制 int c=5; int d=-c; ? d=(~c+1);
|