按位操作
date
Feb 3, 2022
slug
and-or
status
Published
tags
基础知识
summary
从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。
type
Post
概述
按位操作符 将其操作数当做32位的比特序列(二进制).
按位操作符操作数字的二进制形式, 但是返回的依然是标准的JavaScript数值.
操作符 (1)
操作符 `42 | 22`:
101010 = 42
10110 = 22
111110 = 62
操作符 `42 & 22`:
101010 = 42
10110 = 22
000010 = 2
操作符 `42 ^ 22`:
101010 = 42
10110 = 22
111100 = 60
操作符 `~42`:
42 = 00000000000000000000000000101010
-42 = 11111111111111111111111111010101
有符号32位整数
所有的按位操作符的操作都会被转成 补码 形式的有符号32位整数.
补码形式是指一个数的负对应值(如5和-5)为数值的所有比特位反转后, 再加1.
反转比特位即该数值进行'非'位运算, 也即该数值的饭吗
按位逻辑操作符
从概念上讲, 按位逻辑操作符遵守下面规则:
- 操作数被转换成32位整数, 用比特序列标识.
- 超过32位的数字会被丢弃.
- 第一个操作数的每个比特位与第二个操作数的相应比特位匹配.
- 位运算符应用到每对比特位, 结果是新的比特值.
按位移动操作符
- 按位移动操作符有俩个操作数:
- 第一个: 被移动的数字
- 第二个: 要移动的长度
按位移动会先将 操作数 转换为 大端字节顺序(big-endian order) 的32位整数, 并返回与左操作数相同类型的结果.
右操作数应小于32位, 否则只有最低5个四姐会被使用.
注: Big-Endian: 高位字节排放在内存的低地址端, 低位字节排放在内存的高地址端, 又称为 "高位编址".
- Big-Endian 是最直观的字节序:
- 把内存地址 从左到右 按照 由低到高 的顺序写出
- 把值按照通常的 高位到低位 的顺序写出
- 俩者对照, 一个字节一个字节的填充进去
注意: 二进制转换十进制时最右侧的是第0项, 如果是第0项的次方是0, 1的次方是1.
1010101
1 = 1
2 = 4
4 = 16
6 = 64
1 + 4 + 16 + 64 = 85 = 1010101
按位符应用
标志位与掩码
位运算经常用来创建、处理以及读取标志位序列--一种类似二进制的变量, 这样做可以节省内存. 掩码是一个通过 与/或 来读取标志位的位序列