美文网首页
二进制和位操作

二进制和位操作

作者: 云芈山人 | 来源:发表于2021-07-23 23:55 被阅读0次

概述

二进制(binary)是在数学和数字电路中指以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示。数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的[计算机]的设备里都用到二进制。每个数字称为一个比特(Bit,Binary digit的缩写)。

计算机采用二进制原因

  1. 二进位计数制仅用两个数码(0和1)。任何具有二个不同稳定状态的元件都可用来表示数的某一位。而在实际上具有两种明显稳定状态的元件很多。例如,氖灯的"亮"和"熄";开关的”开“和”关“; 电压的”高“和”低“、”正“和”负“;纸带上的”有孔“和“无孔”,电路中的”有信号“和”无信号“, 磁性材料的南极和北极等等。 利用这些截然不同的状态来代表数字,是很容易实现的。不仅如此,更重要的是两种截然不同的状态不单有量上的差别,而且是有质上的不同。这样就能大大提高机器的抗干扰能力,提高可靠性。而要找出一个能表示多于二种状态而且简单可靠的器件,就困难得多了 。

  2. 二进位计数制的四则运算规则十分简单。而且四则运算最后都可归结为加法运算和移位,这样,电子计算机中的运算器线路也变得十分简单了。不仅如此,线路简化了,速度也就可以提高。这也是十进位计数制所不能相比的。

  3. 在电子计算机中采用二进制表示数可以节省设备。可以从理论上证明,用三进位制最省设备,其次就是二进位制。但由于二进位制有包括三进位制在内的其他进位制所没有的优点,所以大多数电子计算机还是采用二进制。此外,由于二进制中只用二个符号 “ 0” 和“1”,因而可用布尔代数来分析和综合机器中的逻辑线路。 这为设计电子计算机线路提供了一个很有用的工具。

  4. 二进制的符号“1”和“0”恰好与逻辑运算中的“对”(true)与“错”(false)对应,便于计算机进行逻辑运算

十六进制用于缩写(简写)二进制,将二进制从后向前 每4位数转换为1位十六进制。

二进制中负数的计算

  • 负数以正数的补码表示
  • 原码
    一个整数按照绝对值的大小转化成二进制的数。
  • 反码
    将二进制数按位取反。
  • 补码
    反码加 1。

以-14 举例:

  • 原码
    14 即 00000000 00000000 00000000 00001110
  • 反码
    11111111 11111111 11111111 11110001
  • 补码
    11111111 11111111 11111111 11110010

所以-14 的二进制是 11111111 11111111 11111111 11110010

  • 假设 我们得到 二进制让我们求整数 就是倒着来取相反数

  • 二进制
    11111111 11111111 11111111 11110010

  • 反码减1
    11111111 11111111 11111111 11110001

  • 原码
    00000000 00000000 00000000 00001110

即 1110 = 14 所以取反 就是-14

位运算

1. 与(&)(and)

对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为1时才为1。

  • 用例:A=60(0011 1100)和 B=13(0000 1101)
  • A&B = 12(0000 1100)

2. 或(|)(or)

比较两个数,然后返回一个新的数,这个数的每一位设置1的条件是两个输入数的同一位都不为0(即任意一个为1,或都为1)。

  • 用例:A=60(0011 1100)和 B=13(0000 1101)
  • A|B = 61(0011 1101)

3. 位异(^)

比较两个数,然后返回一个数,这个数的每个位设为1的条件是两个输入数的同一位不同,如果相同就设为0。

  • 用例:A=60(0011 1100)和 B=13(0000 1101)
  • A^B = 49(0011 0001)

4. 取反(~)

对一个操作数的每一位都取反。

  • A=61
  • ~A = 195(1100 0011)

5. 左移(<<)

将一个运算对象的各二进制位全部左移若干位(左边的二进制丢弃,右边补0)。

  • A=60(0011 1100)
  • A<<2(所有位向左移2位) = 240(1111 0000)

6. 数学右移位/有符号右移(>>)

移位时候,正数高位补0 负数高位补1,用于替代特殊除法计算。

  • 将将6无符号右移2位:6>>2
    0000 0110 然后右移2位后,高位补0:
    0000 0001 换算成10进制为1
  • 将-6无符号右移2位:-6>>>2
    1111 1111 1111 1111 1111 1111 1111 1010 负数都以补码表示
    1111 1111 1111 1111 1111 1111 1111 1110 右移两位
    1111 1111 1111 1111 1111 1111 1111 1101 反码-1
    0000 0000 0000 0000 0000 0000 0000 0010 即0010=2 取反就是-2
  • 将-14无符号右移2位:-14 >> 2
    11111111 11111111 11111111 11110010 负数都以补码表示
    11111111 11111111 11111111 11111100 右移两位
    11111111 11111111 11111111 11111011 反码-1
    0000000 0000000 0000000 00000100 即0100=4 取反就是-4

7. 无符号右移(>>>)

将数字整体向右移位,高位补0,低位自动溢出。

  • 将6无符号右移2位:6>>>2
    0000 0110 然后右移2位后,高位补0:
    0000 0001 换算成10进制为1
  • 将-6无符号右移2位:-6>>>2
    1111 1111 1111 1111 1111 1111 1111 1010 负数都以补码表示
    0011 1111 1111 1111 1111 1111 1111 1110 换算成10进制为1073741822

注意

  1. 在这7种操作符,只有~取反是单目操作符,其它6种都是双目操作符。
  2. 位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。

相关文章

  • Python进阶

    Python二进制表示和位操作 Python二进制表示和位操作 - 简书 OpenH264/libSRTP/lib...

  • Java位操作相关知识总结

    位操作 位操作即将数字转为二进制形式后,按照二进制位进行操作,位操作主要包括如下几种。 & 按位与1 & 1 = ...

  • 二进制和位操作

    概述 二进制(binary)是在数学和数字电路中指以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中...

  • 如何用二进制表示整数与位运算

    续上期《如何操作数据》本文和大家一起学习如何使用二进制表示整数与位运算 整数的二进制表示与位运算 在《如何操作数据...

  • NumPy API(二十四)——二进制操作

    二进制操作 单元位运算 bitwise_and(x1, x2, /[, out, where, …]) 计算位和两...

  • 按位操作符

    按位操作符 按位操作符是将操作数当做32为的比特序列(0和1组成),按位操作符操作数字的二进制形式,但是返回值依然...

  • “~”运算符

    “~”运算符(位非)用于对一个二进制操作数逐位进行取反操作。第 1 步:把运算数转换为 32 位的二进制整数。第 ...

  • 《程序员的数学基础课-二进制,了解计算机的源头》学习笔记

    二进制,了解计算机的源头 二进制的位操作: 二进制左移一位,就是将数字翻倍 二进制右移一位就是将数字除以2并求整数...

  • 什么是位运算

    位运算也被称为位操作。 位操作是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减...

  • 偶数二进制位反转(Java)

    java中相关的位操作 二进制位反转思路 以下二进制位用8位做演示 a = 0000 0110 ; 十进制: 6...

网友评论

      本文标题:二进制和位操作

      本文链接:https://www.haomeiwen.com/subject/xmcpmltx.html