Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >「位运算」计算机基础复习

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

原创
作者头像
拾贰
修改于 2019-08-22 09:49:05
修改于 2019-08-22 09:49:05
5330
举报
文章被收录于专栏:前端讲堂前端讲堂

前言

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

原码、反补以及补码

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

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

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

数值

原码

反码

补码

+1

0000 0001

0000 0001

0000 0001

-1

1000 0001

1111 1110

1111 1111

按位与 &

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

代码语言:txt
AI代码解释
复制
5 & 6
0000 0101
0000 0110
--------
00000100

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

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

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

按位或 |

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

代码语言:txt
AI代码解释
复制
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。

代码语言:txt
AI代码解释
复制
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。

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

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

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

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

按位左移 <<

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

代码语言:txt
AI代码解释
复制
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

按位右移 >>

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

代码语言:txt
AI代码解释
复制
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

最高位为符号位!

拒绝拖延(感谢关注)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
计算机基础(4)——原码、补码、反码
计算机为了区分数值的正负提出了符号位的设定,计算机用最高位存放符号,这个被称为符号位。正数的符号位为0, 负数的符号位为1。
绿水长流z
2025/01/03
1320
计算机基础(4)——原码、补码、反码
计算机原理-原码、补码、反码
原码就是原来的编码,就是字面意思,而补码和反码比较奇怪,为什么需要这两种编码,意义是什么?
潇洒
2023/10/20
2330
世界上有10种人,一种是懂二进制的人,一种是不懂二进制的人。
看到这个问题,我想到了之前的一个场景是要获取近30天的日期列表,我的思路是通过System.currentTimeMillis()获取当前时间戳,然后依次减去对应的毫秒数(24 * 60 * 60 * 1000),后来发现问题:30 * 24 * 60 * 60 * 1000因为超过了int的上限值而变为了一个负数。于是我回复他:
敲得码黛
2021/02/22
1.4K0
世界上有10种人,一种是懂二进制的人,一种是不懂二进制的人。
二进制数的补码及运算(1)
= {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反}
全栈程序员站长
2022/11/01
7470
原 JAVA位运算总结
关于二进制 关于二进制的概念,网上已经很多,这里不多赘述,只说关键的属性说明和示例。 维基百科 记住,原码是给人看的,补码才是计算机真正使用的。 我们一般所说的二进制是有32位,首位是符号位。0是正数,1是负数。下面我们来根据例子说明二进制与十进制的转换,以及原码补码反码的概念。 二进制转10 进制(32位太长,我们省略我8位方便演示) 规则:从后往前依次下标为0,1,2..n,如果位是1 则记2的下标次方,有多少个是1的都相加。最后根据符号位标示正负即可。 示例1:0000 00
石奈子
2018/06/13
6740
(byte)1658385462>>16=-40,怎么算的?
在 Github 项目mongo-java-driver有一个类ObjectId.java,它的作用是生成唯一 id 的,它的核心实现是下面这样一段代码 1:
杨同学technotes
2022/12/26
7270
(byte)1658385462>>16=-40,怎么算的?
java中的常见运算符的计算方式
在说计算方式之前,先说一下计算机中的原码,反码和补码,计算机中存储的二进制都为数据的补码
闻说社
2024/12/31
750
java中的常见运算符的计算方式
计算机基础之位运算 | 按位取反
程序中的所有数在计算机内存中都是以二进制的形式储存的。位操作是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。(摘自维基百科)
宋天伦
2020/08/10
6.7K0
七分钟全面了解位运算
“ 阅读本文大概需要 7 分钟。 ”位运算是我们在编程中常会遇到的操作,但仍然有很多开发者并不了解位运算,这就导致在遇到位运算时会“打退堂鼓”。实际上,位运算并没有那么复杂,只要我们了解其运算基础和运算符的运算规则,就能够掌握位运算的知识。接下来,我们一起学习位运算的相关知识。 程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作。注意:本文只讨论整数运算,小数运算不在本文研究之列位运算的基础我们常用的 3, 5 等数字是十进制表示,而位运算的基础是二进制。
崔庆才
2019/07/16
1K0
一个案例搞懂原码、反码、补码,不懂得请看过来
根据冯~诺依曼提出的经典计算机体系结构框架。一台计算机由运算器,控制器,存储器,输入和输出设备组成。其中运算器,只有加法运算器,没有减法运算器(据说一开始是有的,后来由于减法器硬件开销太大,被废了 )
用户7656790
2020/08/13
1.1K0
一个案例搞懂原码、反码、补码,不懂得请看过来
深入理解位运算符及其在JavaScript中的应用
沉浸式趣谈
2024/03/13
1280
深入理解位运算符及其在JavaScript中的应用
数字逻辑基础:原码、反码、补码
以3为例,+3对应的二进制数是00000011,-3对应的二进制数是10000011。
WuShF
2023/03/01
6630
数字逻辑基础:原码、反码、补码
可能是最通俗易懂的 Java 位操作运算讲解
Java 位操作这是一项很基础很基础的知识内容,在所有 Android 和 Java 开发者的学习之路上,大家都接触过,但是实际运用的场景却很少见,很多人估计都忘记有这个知识点了。事实上,在 C/C++ 开发领域因为与硬件的联系更紧密,所以位操作运算应用的更普遍。Java 因为面向对象的特性很多时候不需要接触位操作,但是在某些特定场景下,巧妙运用位操作,能够起到非常高效的的表现。这篇博文不谈应用,只详细讲解与位操作有关的知识点。
Frank909
2019/01/14
1.1K0
C++中的位运算和原码、反码、补码
在C、C++中有一系列位运算符,在学习位运算符的时候就需要先了解反码、补码的原理。 因为位运算是按照变量在内存中所表示来进行运算的。
雪碧君
2023/02/15
1.3K0
计算机按位取反[通俗易懂]
步骤一:1的二进制码 0000 0001 步骤二:1的补码 0000 0001 步骤三:按位取反 1111 1110 步骤四:求其原码(负数的补码求其原码 是-1取反) 补码-1为 1111 1101 然后取反 1000 0010 为-2
全栈程序员站长
2022/09/21
2.5K0
原码、反码、补码详解
一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为 0,负数为 1。
马修
2021/01/21
9920
位运算 原
举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
wuweixiang
2018/08/14
1K0
软考准备之计算机系统基础知识(中)
平时有很多碎片化时间,比如下班的地铁上,或者等待的时间,我们总喜欢拿出手机玩,这个时间也可以用来学习呢,佳爷最近想考考软件设计师,所以把自己准备的过程记录下来,也希望在碎片时间可以复习。
仇诺伊
2021/03/16
5150
软考准备之计算机系统基础知识(中)
C语言关于进制转换,补码, 整数的位操作
一、进制转换  //关于进制转换,从网上找了几张经典图片,便于后面查询 1、二进制转十进制、八进制转十进制、十六进制转十进制 2、十进制转二进制, 十进制转八进制,十进制转十六进制 3、二进制转八进制
tandaxia
2018/09/27
5.1K0
C语言关于进制转换,补码, 整数的位操作
一文读懂原码、反码与补码
二进制和十进制一样,也是一种进位计数制,但是它的基数是 2。二进制表达式中 0 和 1 的位置不同,它所代表的数值也不同。例如,二进制数 0000 1010 表示十进制数 10。一个二进制数具有两个基本特点:两个不同的数字符号,即 0 和 1,逢二进一。
阿宝哥
2020/01/14
2.7K0
一文读懂原码、反码与补码
相关推荐
计算机基础(4)——原码、补码、反码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文