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的结果又是什么?为什么?

posted @ 2015-10-26 17:02  玩呀熊熊  阅读(181)  评论(0编辑  收藏  举报