我们先看下基础知识
用例子总结一下
为运算:左高右低
0011 << 1 ===> 0110
0110 >>1 ===>0011
0011 | 1011 ===> 1011
0011 & 1011 ===>0011
~0011 ==>1100
0011 ^ 1011 ===> 1000 相同为0 不同为1
异或XOR操作的一些特点:
x ^ 0 = x
x ^ 1s = ~x //注意1s= ~0
x ^ (~x) = 1s
x ^ x = 0
a ^ b ^ c = a ^ ( b ^ c ) =(a ^ b ) ^ c
例:交换inta=5,int b=6;
a=a^b;
b=a^b;
a=a^b;
指定位置的位运算:
1、将x最右边的n位清零: x & ( ~ 0 << n)
2、获取x 的第 n位值 (0 或者1):(x >> n ) & 1
3、 获取x的第n位的幂值 : x & ( 1<< n)
4、 仅将第n位值为1 : x| (1<< n)
5、 仅将第n 位值为 0 : x & (~ (1<< n))
6、将x最高位至第n位(含)清零: x & (( 1<< n) -1)
7、将第n位 至第 0 位 (含) 清零: x & ( ~(( 1<<(n+1))-1))
实战位运算要点:
1、判断奇偶:
x % 2 ==1 ===> ( x & 1 ) ==1
x % 2 == 0 ====> (x & 1) == 0
2、x / 2 ====> x >> 1
3、x = x & ( x-1) 清零最低位的1
4、x & -x 得到最低位的1
5、x & ~x ===> 0
负数而言,三种表示法是不一样的。
①原码:符号位“1”+二进制数绝对值数值
②反码:符号位“1”+数值位按位取反
③补码:反码+“1”(末位)
示例:-5原码=1 0000101; 反码=1 1111010; 补码=1 1111011
左移一位相当于该数乘以2,左移2位相当于该数乘以2^2=4。上面举的例子15<< 2=60,即乘了4。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况好了,下面看MeasureSpec中的按位运算、移位运算:
android经常会有类似如图,(0的二进制数为00)00左移30位,达到的目的就是去形成一个32位的值
将图2可以用图3解释
~ 这个符号是求反,0变1,1变0,~MODE_MASK=11111111,11111111,11111111,11111111
& 这个符号为与运算,两个二进制值完全一样才会得1,不同则为0
或运算如下图
打包的规则是:将左边size转换为32位,将右边mode转换为32位,然后进行或运算。前两位作为mode,后30位作为size