按位操作

date
Feb 3, 2022
slug
and-or
status
Published
tags
基础知识
summary
从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。
type
Post

概述

按位操作符 将其操作数当做32位的比特序列(二进制). 按位操作符操作数字的二进制形式, 但是返回的依然是标准的JavaScript数值.
操作符 (1)
运算符
用法
描述
a&b
只有俩个相同位数比特都是1结果才为1, 否则为0
a&b
当俩个相同位数比特存在且只有一个1时, 结果为1, 否则为0
~a
反转操作数的比特位, 即0变1, 1变为0
a<<b
a 的二进制形式向左移 b 比特位, 右边用0填充
a>>b
a 的二进制形式向右移 b 比特位, 丢弃被移出的位
a>>>b
a 的二进制标识向右移 b, 丢弃被移除的位, 并使用 0 在左侧填充
操作符 `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 是最直观的字节序:
      1. 把内存地址 从左到右 按照 由低到高 的顺序写出
      1. 把值按照通常的 高位到低位 的顺序写出
      1. 俩者对照, 一个字节一个字节的填充进去
注意: 二进制转换十进制时最右侧的是第0项, 如果是第0项的次方是0, 1的次方是1.
1010101
1 = 1
2 = 4
4 = 16
6 = 64
1 + 4 + 16 + 64 = 85 = 1010101

按位符应用

标志位与掩码

位运算经常用来创建、处理以及读取标志位序列--一种类似二进制的变量, 这样做可以节省内存. 掩码是一个通过 与/或 来读取标志位的位序列

© jianxiaoBai 2021 - 2024