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

  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/wan0807/p/4911737.html
Copyright © 2011-2022 走看看