• 位运算和关于两个数交换的多种方法


    我们知道,位运算在计算中有着广泛的应用。

    在计算机的各种编程语言中位运算也是一种不可缺少的运算,尤其是在计算机的底层实现代码中。

    以下我们就来介绍一下位运算。

    1.左移运算<<  左移右移都是移动二进制数

    0000-0000 0000-0000 0000-0000 0000-1100     =12 向左移动一位变为(右边缺几位就补几个0)

          0000-0000 0000-0000 0000-0000 0001 1000       =24 再向左移一位

       0000-0000 0000-0000 0000-0000 0011 0000         =48

    由此,我们能够得到,事实上m向左移n位后,m=m*2^n;即每向左移一位,该数就会增到一倍。


    2.右移运算和左移运算类似,可是也有一个差别。

                  0000-0000 0000-0000 0000-0000 0000-1100            =12 向右移一位

            0000-0000 0000-0000 0000-0000 0000-0110          =6再向右移一位

                       0000-0000 0000-0000 0000-0000 0000-0011       =3再向右移动一位

          0000-0000 0000-0000 0000-0000 0000-0001    =1

    我们也能够得到一个规律。每向右移动一位。该数就会减小一倍(按计算机的整数规律减小)


    >>向右移动的过程中,左边是补0还是1,是依据原来的数的最高位来确定的。原来数的最高位是1。则补1,否则补0

       >>> 向右移动的过程中。无论原来数的最高位是1还是0。都补0,所以我们应该依据须要来选择,右移是用>>>还是>>.

      3.&与运算

    与运算相同都是对二进制位来说的。比方14&7=2(省略了前面的二进制位)

    1010

              &0111

          ----------------

                  0010

          4.|或运算 与与运算类似(略)

      5.~运算也都差点儿相同

      6.^异或运算,我们主要看一下异或运算  12^7=11

    1100

                   ^0111

    --------------------------

                   1011

       异或运算就是两个数不同样则为1,同样则为0。 

       7.我们讲一下在计算机中是如何将二进制转化为16进制的

         0000-0000 0000-0000 0000-0000 0010-1011

         我们都知道,仅仅要将每四位一取。然后对每一项算出它的16进制,然后再合起来就是2进制的16进制的表现形式

        上面的数据应该是  2 11

        那计算机是如何算的呢?这儿就是用&运算来完毕的,

        首先。将上数进行以下的与运算

        0000-0000 0000-0000 0000-0000 0010-1011

      &0000-0000 0000-0000 0000-0000 0000-1111

    ---------------------------------------------------------------------

        0000-0000 0000-0000 0000-0000 0000-1011

      这样,我们就把上面的数据的最后四位二进制位取出来了,然后进行计算就得到16进制的值

      假设我们要把倒数的第二个四位二进制位取出来,那又该怎么取呢?

    我们仅仅须要把该书向右移四位,然后再取就ok了。

    很easy吧。这也是位运算在计算机中的应用之中的一个。

    8.接下来我们讲一下。用位运算怎么交换两个数

    int a=8,b=2;

         最普通的方法:int temp=a,a=b,b=temp,最简单最经常使用的。不多说。

         略微高级一点的:a=a+b

      b=a-b

      a=a-b

         再高级一点的位运算:a=a^b

     b=a^b

     a=a^b

       这是为什么?

       由于异或运算有一个特点,例如以下10^8=2

                       1010

      ^1000

                   ------------

                        0010    

        可是10^8^8=??

    ?

    ?    =10

                              0010

                          ^  1000

                          -------------

                              1010

    也就是说,n^m^m=n,奇妙吧,慢慢领会就会了。









  • 相关阅读:
    HDU 5919 分块做法
    HDU 3333 分块求区间不同数和
    CF 333E 计算几何+bitset优化
    hdu 1043 八数码--打表
    hdu 1043 八数码问题-A*搜索
    hdu 5919 主席树
    hiho1388 FFT/NTT
    HDU 5869区间CGD不同种类数---树状数组+map统计区间不同种类数(离线)
    HDU 5875 二分+st表
    HDU 5898 基础数位DP
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6732777.html
Copyright © 2020-2023  润新知