二进制运算

435 阅读2分钟

常见运算符

&(与),|(或),^(异或),~(非),>>(算数右移),<<(左移),>>>(无符号右移)

需要关注的几个:

  • 算术右移: 左边空出的位是根据最高位是0和1来进行填充的;
  • 无符号右移动: 左侧空出来的位由 0 填充
  • 左移: 右边空出来的位由 0 填充
  • 异或: 相同为 0 ,不同为 1

注意知识点

  1. 负数在计算机里面是以补码的形式存在的。

  2. 原码,反码,补码

  • 原码:就是一个数的二进制

  • 反码:二进制的按位取反

  • 补码,二进制的按位取反加一

举个例子:

9 在计算机中的存储为:0...1001

-9 在计算机中存储为:1...0111(最左侧为符号位)

-9 的运算过程:0...1001 -> 1...0110 -> 1...0111

练习一下位运算

  1. -9 >> 2 = -3

表示: -9 向右带符号位移动两位

解法: 1...0111 ->(右移两位) 1...01 ->(减一)1...00 -> (取反) 1...11 最后得到 -3

  1. ~9 = -10

表示:对9取反

解法:0...1001 ->(取反得负数,为一个补码) 1...0110 ->(减一)1...0101 -> (取反) 1...1010 最后得到 -10

为什么减一,因为负数在保存的时候加了一,所以在转换成十进制的时候要减一

js 中的进制转换

十进制转二进制

NumberObject.toString(radix);

其中,radix为可选。规定表示数字的基数,使 2 ~ 36 之间的整数。若省略该参数,则使用基数 10。但是要注意,如果该参数是 10 以外的其他值,则 ECMAScript 标准允许实现返回任意值。

返回值

数字的字符串。例如,当 radix 为 2 时,NumberObject 会被转换为二进制值表示的字符串。

抛出

当调用该方法的对象不是 Number 时抛出 TypeError 异常。

其他进制转十进制

parseInt(string, radix);

其中,string为必需。要被解析的字符串。radix为可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则parseInt() 将返回 NaN。

返回值

返回解析后的数字。

说明

当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。