2015-10-26 一些位运算符 课程笔记
1、&和|
&表示按位与操作,|表示按位或操作。这里注意一点,这两种运算符满足交换律和结合律。
交换律: a&b = b&a;
结合律: a&(b&c) = (a&b)&c
2、关于<< 和>>的注意点:
2.1 左移运算是将运算数的二进制位左移。
规则:高位丢弃,低位补0
2.2 右移运算是将运算数的二进制位右移
规则:高位补符号位,低位丢弃。这里要格外注意,不是补0.
3、关于交换两个变量的方法分析:
3.1 第一种方法,很常见,也很易懂,代码如下:
1 void main() 2 { 3 int a =10; 4 int b =18; 5 6 int temp = a; 7 a = b; 8 b = temp; 9 }
3.2 第二种方法,这种方法采用算术运算的方式:
1 void main() 2 { 3 int a =10; 4 int b = 18; 5 6 a = a - b; 7 b = a + b; 8 a = b - a; 9 10 }
3.3 第三种方法,采用位运算符^的方式:
1 void main() 2 { 3 int a =10; 4 int b =18; 5 6 a = a^b; 7 b = a^b; 8 a = a^b; 9 10 }
以上这三种方法的正确性,各位可以去亲自验证一下。
第一种方法是我们最最常见的方法,这种方法也最浅显易懂,而且适用类型更为广泛,不仅整数可以浮点型变量也可以。但是需要定义第三个变量来用作中间变量。
第二种方法,没有利用第三个变量节省了空间,而且也不难理解,但是这种方法执行的时间比较长,而且还有一个致命的弱点就是,当两个待交换的变量很大的时候在第7行代码处,有可能造成数据溢出。
第三种方法,利用按位异或运算来实现,这种方法没有利用第三个变量,节省空间,而且位运算的速度比较快,最好的一点就是不用担心数据的溢出。但是这种方法不适用于浮点型变量的交换。
相比之下,第三种方法要更好一点,当然这是我个人的意见,具体用的时候还是要根据实际情况来决定用哪种方案。
4、课后思考题
4.1 一个面试题,有一个数列,其中的自然数都是偶数个,只有一个自然数出现的次数是奇数次。编写代码找出这个自然数。
4.2 &&、||、!和&、|、~的意义是否相同,他们可以在条件表达式中交换使用吗?为什么?
4.3 1<<32的结果是什么?1<<-1的结果又是什么?为什么?