MeasureSpec中的按位运算符、移位运算符讲解(左位移、与、求反)

我们先看下基础知识




用例子总结一下

为运算:左高右低

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位的值

1

将图2可以用图3解释

2


3


~  这个符号是求反,0变1,1变0,~MODE_MASK=11111111,11111111,11111111,11111111

& 这个符号为与运算,两个二进制值完全一样才会得1,不同则为0


或运算如下图


打包的规则是:将左边size转换为32位,将右边mode转换为32位,然后进行或运算。前两位作为mode,后30位作为size

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容