<< >>
- 一般规律:
左移变小,右移变大,且移动1整个数值变化的倍数是2倍。
比如:(12<<2)=24
(12>>2)=6
- 整数和具体的位:
这里n取值为5,k取值为2(k代表的是位的下标,下标从0开始).且以一个字节长8位作为解释。
- 取整数n二进制的第k位:(n>>k)&1
解释:
n:0000 0101
n>>2: 0000 0001
1:0000 0001
(n>>2)&1: 0000 0001
思路:只要思想是构造,然后用&来操作。即构造一个字节8位只有连续的0和1(此题就是1).然后,当任何一个二进制 和这个数
进行按位与运算,就会结合数值是1的0位和数值是n的其他位。
- 取整数n二进制的后k位:((1<<k+1)-1)&n
思路:思想还是和上面的一样,就是构造一个字节8位,特征是只有连续的0和1.当n和这个字节做按位与运算的时候,结果就是
结合了这个字节的0位和n的其他位。那么特征字节怎么构造,一般的构造这种特征字节一定需要移动,但是只移动不能构成连续
,所以中间结果减一,就可以得到连续的0,1组合。
总结:
按位与的利用,做了特殊处理,就像以上的做法可以得到惊人的效果。按位与最终的结果是一个组合,即0000...和其他有用的位
就是要得到的位。
异或,按位取反
异或的意思就是按位运算时,同号的正(二进制表示0为正,反之1为负),异号的负。
按位取反,就是0得1,1得0。
这就有了原码,反码,和补码的区别:
原码到反码:除了符号位不变,数值位按位取反,
原码到补码:除了符号位不变,数值位取反加1,。
反码到原码:(反码的反码)除了符号位不变,数值位按位取反。
补码到原码:(补码的补码)除了符号位不变,数值位取反加1,。
逻辑短路
A&&B:当A为假的时候,结果就是假的,就不会再看B,只有结果是真的时候,才会看B的结果。而且取决于B
即,if(A) B
A||B:当A为真的时候,结果就是真的,就不会再看B,只有结果是假的时候,才会看A的结果。而且取决于B
即 if(!A) B
所以,利用好逻辑运算的短路情况,就能提高编程的效率。