前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「位运算」计算机基础复习

「位运算」计算机基础复习

作者头像
拾贰
发布2019-08-28 11:01:42
4370
发布2019-08-28 11:01:42
举报
文章被收录于专栏:前端讲堂

前言

这两天有点闲,划水太严重。没有学习啥东西,跑去翻了一下书,看到 &, |, ^, ~, << ,>> 这些位运算。然后就想起来了计算机的 原码反码补码。感觉写了两年的前端,我好像早已把这些东西抛之脑后,对于位运算我好像也没用过。写这个算是给自己复习,记录一下吧。

原码、反补以及补码

在这之前我们可以先了解一下机器数和真值。机器数是将符号"数字化"的数,是数字在计算机中的二进制表示形式。机器数有两个特点:一是符号数字化,二是其数的大小受机器字长的限制。真值是指在一定的时间及空间(位置或状态)条件下,被测量所体现的真实数值。真值是一个变量本身所具有的真实值,它是一个理想的概念,一般是无法得到的。所以在计算误差时,一般用约定真值或相对真值来代替。通常所说的真值可以分为“理论真值”、“约定真值”和“相对真值”。

计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。

  • 原码:是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
  • 反码:反码通常是用来由原码求补码或者由补码求原码的过渡码。反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。
  • 补码:正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。

数值

原码

反码

补码

+1

0000 0001

0000 0001

0000 0001

-1

1000 0001

1111 1110

1111 1111

按位与 &

只有对应的两个二进位都为1时,结果位才为1。参与运算的两个数均以补码出现。

代码语言:javascript
复制
5 & 6
0000 0101
0000 0110
--------
00000100

// 将 0000 0100 转换为十进制为 4

-5 & 6
1111 1011
0000 0110
--------
0000 0010

// 将 0000 0010 转换为十进制为 2

按位或 |

只要对应的两个二进位有一个为1时,结果位就为1。当参与运算的是负数时,参与两个数均以补码出现。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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。

代码语言:javascript
复制
~10
0000 1010
---------
0111 0101
// 逐位取反 + 1
1000 1011

// 将 1000 1011 转换为十进制为 -11

~-10
1000 1010
---------
1111 0110
// 逐位取反 + 1
0000 1001

// 将 0000 1001 转换为十进制为 9

按位左移 <<

参加运算的数换算为二进制后,进行左移运算,用来将一个数各二进制位全部向左移动若干位。

代码语言:javascript
复制
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

按位右移 >>

参加运算的数换算为二进制后,进行左移运算,用来将一个数各二进制位全部向右移动若干位。

代码语言:javascript
复制
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

最高位为符号位!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 原码、反补以及补码
  • 按位与 &
  • 按位或 |
  • 按位异或 ^
  • 按位取反 ~
  • 按位左移 <<
  • 按位右移 >>
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档