位运算

Spike Zhang

为什么会存在十六进制并且广泛使用?

我的理解是十进制描述的是纯数值型,十六进制是标称型+数值型,标称型用于处理状态机。人有十个手指,这可能是十进制最早起源的原因,但是无法表示状态。我们如何记录正负,甚至是虚数、复数。如果不加入额外标识无法表示吧,那机器呢,他可是只能运算二进制信号,所以最合适的描述载体有两个必要条件:

  1. 二的直系等比倍数;
  2. 大于十并且越小越好。

那么十六是最合适的选择。


计算机通信的基本原理是将电信号转换为逻辑信号,其转换方式是将高低电频表示为二进制数中的1和0, 再通过不同的二进制序列来表示所有的信息。

含义 Pascal语言 C语言 Java Scala Python
按位与 a and b a & b a & b a & b a & b
按位或 a or b a ¦ b a ¦ b a ¦ b a ¦ b
按位异或 a xor b a ^ b a ^ b a ^ b a ^ b
按位取反 not a ~a ~a ~a ~a
左移 a shl b a << b a << b a << b a << b
带符号右移 a shr b a >> b a >> b a >> b a >> b
无符号右移 a >>> b a >>> b a >>> b

BIN_OCT_HEX_DEC

  • BIN : binary 二进制

  • OCT : octal 八进制

  • DEC : decimal 十进制

  • HEX : hexadecimal 十六进制

    位运算基于二进制

与 and运算 &

同位同为1结果为1

5 & 3

标识 DEC BIN
数一 5 0101
数二 3 0011
结果 1 0001

4 & 1

标识 DEC BIN
数一 4 0100
数二 1 0001
结果 0 0000

或 or运算 |

同位存在1结果为1

5 | 3

标识 DEC BIN
数一 5 0101
数二 3 0011
结果 7 0111

10 | 5

标识 DEC BIN
数一 2 0010
数二 5 0101
结果 7 0111

异或 xor运算 ^

同位不同结果为1

5 ^ 3

标识 DEC BIN
数一 5 0101
数二 3 0011
结果 6 0110

10 ^ 5

标识 DEC BIN
数一 2 0010
数二 5 0101
结果 7 0111

10 ^ 10

标识 DEC BIN
数一 7 0111
数二 7 0111
结果 0 0000

非 not运算 ~

按位取反

~ 5

标识 DEC BIN
数一 5 0101
结果 -6 1010

左移位 shl运算 <<

左移2n位后,低位补0

5 << 2

标识 DEC BIN
数一 5 0000 0101
结果 10 0000 1010

右移位 shr运算 >>

右移2n位,高位补0

4 >> 2

标识 DEC BIN
数一 4 0000 0100
结果 2 0000 0010

易失去精度,无法恢复

5 >> 2

标识 DEC BIN
数一 5 0000 0101
结果 2 0000 0010
  • 标题: 位运算
  • 作者: Spike Zhang
  • 创建于 : 2017-04-03 19:36:48
  • 更新于 : 2024-06-21 14:31:36
  • 链接: https://chaosbynn.github.io/2017/04/03/位运算/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论