zoukankan      html  css  js  c++  java
  • 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的结果又是什么?为什么?

  • 相关阅读:
    第一次博客作业
    个人总结
    第三次个人作业——用例图设计
    第二次个人编程
    第一次个人编程
    第一次随笔
    个人总结
    第三次个人作业——用例图设计
    第二次结对作业
    第一次结对作业
  • 原文地址:https://www.cnblogs.com/wan0807/p/4911737.html
Copyright © 2011-2022 走看看