那些年我们一起学过的二进制

前言

本篇主要讲解了二进制的常见位运算及其特殊用法以及‘原码’、‘反码’与‘补码的概念’。

一、二进制位运算

  1. 与运算
    · 符号:‘ & ’
    · 运算规则:相同位作比较,只有当两位全为1,结果才为1。
    · 例如:0110 & 0011 = 0010
    · 图示如下:
    与运算例子图解

  2. 或运算
    · 符号:‘ | ’
    · 运算规则:只要有一个为1,结果就为1
    · 例如:0110 | 0011 = 0111
    · 图示如下:
    或运算例子图解

  3. 异或运算
    · 符号:‘ ^ ’
    · 运算规则:两个相应位为‘异’(值不同), 则该位结果为1,否则为0
    · 例如:6 ^ 3 = 5(0110 ^ 0011 = 0101)
    · 图示如下:
    异或运算例子图解

  4. 反码
    · 符号:‘ ~ ’
    · 运算规则:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
    · 例如:~6 = -7(~0110 = 1001)1001用有符号数表示为‘-7’,用无符号数表示为‘9’

  5. 左移
    · 符号:‘ << ’
    · 运算规则: 将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0),若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2
    · 例如:3 << 2 = 12(1100 <--- 0011)

  6. 右移
    · 符号:‘ >> ’
    · 运算规则:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃操作数每右移一位,相当于该数除以2
    · 例如:3 >> 1 = 1(0011 ---> 0001)

  7. 无符号右移
    · 符号:‘ >>> ’
    · 运算规则: 各个位向右移指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃
    · 例如:3 >>> 1 = 1(0011 ---> 0001)

  8. 使用位运算的好处:
    1)特定情况下,计算方便,速度快,被支持面广
    2)其他算术方法速度慢,并且逻辑比较复杂。例如‘乘,除’运算在低端、简单的单片机中根本无法实现,只能通过位运算来间接代替乘除法运算。

二、位运算的特殊用法

  1. 与运算的特殊用法:
    1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零
    2)取一个数中的指定位(比如低4位,高4位等)
    例:设 X = 1000 1010,取X的低4位,用X & 0000 1111 = 0000 1010即可得到。
    方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位

  2. 或运算的特殊用法:
    1)常用来对一个数据的某些位置1
    例:将X = 1000 1010的高4位置1,用X | 1111 0000 = 1111 1010即可得到。

  3. 异或运算的特殊用法:
    1)使特定位翻转:找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可
    例:X = 1000 1010,使X高4位翻转,用X ^ 1111 0000 = 0111 1010即可得到。
    2)与0相异或,可保留原值。
    例:X = 1000 1010X ^ 0000 0000 = 1000 1010
    3)实现两个变量的值的交换:
    例:A = A ^ B; B = A ^ B; A = A ^ B;

原码、反码与补码

  1. 原码:一个整数按照绝对值大小转换成的二进制数称为原码。
  2. 反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
  3. 补码:反码加1称为补码。
  4. 负数在计算机中是以其正值的补码形式表示的

补充:

两个变量交换值的方法(有三个)

  1. 借助第三个变量来实现
    C = A; A = B; B = C;
  2. 利用加减法实现两个变量的交换
    A = A + B; B = A - B; A = A - B;
  3. 用位异或运算来实现,也是效率最高的
    A = A ^ B; B = A ^ B; A = A ^ B;

猜你喜欢

转载自blog.csdn.net/chenlintao_csdn/article/details/87912437
今日推荐