这两天有点闲,划水太严重。没有学习啥东西,跑去翻了一下书,看到 &
, |
, ^
, ~
, <<
,>>
这些位运算。而后就想起来了计算机的 原码
,反码
和 补码
。感受写了两年的前端,我好像早已把这些东西抛之脑后,对于位运算我好像也没用过。写这个算是给本身复习,记录一下吧。javascript
在这以前咱们能够先了解一下机器数和真值。机器数是将符号"数字化"的数,是数字在计算机中的二进制表示形式。机器数有两个特色:一是符号数字化,二是其数的大小受机器字长的限制。真值是指在必定的时间及空间(位置或状态)条件下,被测量所体现的真实数值。真值是一个变量自己所具备的真实值,它是一个理想的概念,通常是没法获得的。因此在计算偏差时,通常用约定真值或相对真值来代替。一般所说的真值能够分为“理论真值”、“约定真值”和“相对真值”。前端
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。java
原码:是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增长了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其他位表示数值的大小。学习
反码:反码一般是用来由原码求补码或者由补码求原码的过渡码。反码跟原码是正数时,同样;负数时,反码就是原码符号位除外,其余位按位取反。spa
补码:正数的补码就是其自己,负数的补码是在其原码的基础上, 符号位不变, 其他各位取反, 最后+1。code
数值 | 原码 | 反码 | 补码 |
---|---|---|---|
+1 | 0000 0001 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
&
只有对应的两个二进位都为1时,结果位才为1。参与运算的两个数均以补码出现。cdn
5 & 6
0000 0101
0000 0110
--------
00000100
// 将 0000 0100 转换为十进制为 4
-5 & 6
1111 1011
0000 0110
--------
0000 0010
// 将 0000 0010 转换为十进制为 2
复制代码
|
只要对应的两个二进位有一个为1时,结果位就为1。当参与运算的是负数时,参与两个数均以补码出现。ip
3 | 4
0000 0011
0000 0110
---------
0000 0111
// 将 0000 0111 转换为十进制为 7
-3 | 4
1111 1101
0000 0100
---------
1111 1101
// 逐位取反 + 1
1000 0011
// 将 1000 0011 转换为十进制为 -3
复制代码
^
若是对应的两个二进位值不相同,则异或结果为1。若是对应的两个二进位值相同,异或结果为0。it
7 ^ 8
0000 0111
0000 1000
---------
0000 1111
// 将 0000 1111 转换为十进制为 15
-7 ^ 8
1111 1001
0000 1000
---------
1111 0001
// 逐位取反 + 1
1000 1111
// 将 1000 1111 转换为十进制为 -15
复制代码
~
二进制值每一位取反,0变1,1变0。io
~10
0000 1010
---------
0111 0101
// 逐位取反 + 1
1000 1011
// 将 1000 1011 转换为十进制为 -11
~-10
1000 1010
---------
1111 0110
// 逐位取反 + 1
0000 1001
// 将 0000 1001 转换为十进制为 9
复制代码
<<
参加运算的数换算为二进制后,进行左移运算,用来将一个数各二进制位所有向左移动若干位。
10 << 2
0000 1010
---------
0010 1000
// 将 0010 1000 转换为十进制为 40
-10 << 2
1000 1010
---------
// 先求补码,按位取反 + 1
1111 0110
// 左移 2 位
1101 1000
// 求补码,按位取反 + 1
1010 1000
// 将 1010 1000 转换为十进制为 -40
复制代码
>>
参加运算的数换算为二进制后,进行左移运算,用来将一个数各二进制位所有向右移动若干位。
10 >> 2
0000 1010
---------
0000 0010
// 将 0000 0010 转换为十进制为 2
-10 >> 2
1000 1010
---------
// 先求补码,按位取反 + 1
1111 0110
// 右移 2 位
1111 1101
// 求补码,按位取反 + 1
1000 0011
// 将 1010 1000 转换为十进制为 -3
复制代码
最高位为符号位!
公众号:前端讲堂
公众号ID:js-say