zoukankan      html  css  js  c++  java
  • 位运算的基本操作【转载】

    https://blog.csdn.net/mengzhengjie/article/details/80611422

    leetcode 总结

    位运算小结(按位与、按位或、按位异或、取反、左移、右移)

    位运算不管是在Java语言,还是在C语言中,或者其他语言,都是经常会用到的,所以本文也就不固定以某种语言来举例子了,原始点就从0、1开始。位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)、右移(>>)这几种,其中除了取反(~)以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。

       1、补码

       在总结按位运算前,有必要先介绍下补码的知识,我们知道当将一个十进制正整数转换为二进制数的时候,只需要通过除2取余的方法即可,但是怎么将一个十进制的负整数转换为二进制数呢?其实,负数是以补码的形式表示,其转换方式,简单的一句话就是:先按正数转换,然后取反加1。

     
    1
    2
    3
    4
    5
    6
    7
    要将十进制的-10用二进制表示,先将10用二进制表示:
    0000 0000 0000 1010
    取反:
    1111 1111 1111 0101
    加1:
    1111 1111 1111 0110
    所以,-10的二进制表示就是:1111 1111 1111 0110

       2、按位与(&)

       参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则该为为0。

    1
    2
    3
    4
    5
    6
    将10与-10进行按位与(&)运算:
    0000 0000 0000 1010
    1111 1111 1111 0110
    -----------------------
    0000 0000 0000 0010
    所以:10 & -10 = 0000 0000 0000 0010

       3、按位或(|)

       参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0。

    1
    2
    3
    4
    5
    6
    将10与-10进行按位或(|)运算:
    0000 0000 0000 1010
    1111 1111 1111 0110
    -----------------------
    1111 1111 1111 1110
    所以:10 | -10 = 1111 1111 1111 1110

       4、按位异或(^)

       参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0。

    1
    2
    3
    4
    5
    6
    将10与-10进行按位异或(^)运算:
    0000 0000 0000 1010
    1111 1111 1111 0110
    -----------------------
    1111 1111 1111 1100
    所以:10 ^ -10 = 1111 1111 1111 1100

       可以看出,任何数与0异或,结果都是其本身。利用异或还可以实现一个很好的交换算法,用于交换两个数,算法如下:

    1
    2
    3
    a = a ^ b;
    b = b ^ a;
    a = a ^ b;

       5、取反(~)

       参加运算的两个数,换算为二进制(0、1)后,进行取反运算。每个位上都取相反值,1变成0,0变成1。

    1
    2
    3
    4
    5
    对10进行取反(~)运算:
    0000 0000 0000 1010
    ---------------------
    1111 1111 1111 0101
    所以:~10 = 1111 1111 1111 0101

       6、左移(<<)

       参加运算的两个数,换算为二进制(0、1)后,进行左移运算,用来将一个数各二进制位全部向左移动若干位。

    1
    2
    3
    4
    5
    对10左移2位(就相当于在右边加2个0):
    0000 0000 0000 1010
    --------------------
    0000 0000 0010 1000
    所以:10 << 2 = 0000 0000 0010 1000 = 40

       注意,观察可以发现,左移一位的结果就是原值乘2,左移两位的结果就是原值乘4。

       7、右移(>>)

       参加运算的两个数,换算为二进制(0、1)后,进行右移运算,用来将一个数各二进制位全部向右移动若干位。

    1
    2
    3
    4
    5
    对10右移2位(就相当于在左边加2个0):
    0000 0000 0000 1010
    --------------------
    0000 0000 0000 0010
    所以:10 >> 2 = 0000 0000 0000 0010 = 2

       注意,观察可以发现,右移一位的结果就是原值除2,左移两位的结果就是原值除4,注意哦,除了以后没有小数位的,都是取整。

  • 相关阅读:
    Python【第四章】:socket
    vb与C#的区别,片段记录
    使用XUACompatible来设置IE浏览器兼容模式
    notepad++ 的golang语法高亮
    ReSharper 配置及用法(转)
    宽度可变的Table
    JS禁止选中文本方法【转】
    只借助HTML分别禁用IE8, IE9的兼容视图模式(Compatibility View)
    测试浏览器对js版本的支持
    写有效率的SQL查询(II)(转载)
  • 原文地址:https://www.cnblogs.com/joelwang/p/10949007.html
Copyright © 2011-2022 走看看