进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)
我发现网上关于标题上的内容介绍的都很零碎,因此为了方便查找、也为了本人对这一部分的充分理解,就想着写一篇这样的博客(我分成了几个部分,以便查找):
一、进制转换
让我们先来看看各个进制的定义:
- 十进制:就是我们平时很熟悉的,例如123、52、39等等;
- 二进制:以0b开头(那是零,不是英文o,因为二进制英文是binary,所以是0b),例如:0b11(也就是十进制中的3);
- 八进制:以0开头(零),例如015(也就是十进制的13);
- 十六进制:以0x或0X开头(零、英文x或X),例如:0xF(也就是十进制中的15)。
了解了进制的定义,我们再来看看各个进制之间的转换(通常都是十进制与其他进制之间的转换):
先说十进制转换为其他进制:十进制数÷相应进制=商······余数→商÷相应进制=新的商······余数,直到 商 为0为止;然后把余数从右到左依次排列,就是相应进制的数了
计算机是以二进制存储的,所以我们主要说一下转换为二进制的:
举个例子,把11转换为二进制,过程:
11÷2=5······1,5÷2=2······1,2÷2=1······0,1÷2=0······1,所以二进制就是0b1011;
再来一个八进制的吧,把21转换为八进制,过程:
21÷8=2······5,2÷8=0······2,所以八进制就是025,
把35转换为十六进制,过程:
35÷16=2······3,2÷16=0······2,所以十六进制就是0x23,
我们再说说其他进制转换为十进制:举个例子大家就明白了,
把0b1011转换为十进制,过程:
- 1×20 + 1×21 + 0×22 + 1×23 = 11
我们再来一个,把0x2AE转换为十进制:
- 14×160 + 10×161 + 2×162 = 486
说完了这个,我们再来说说有关原码、补码、反码的一些东西
二、有关原码、补码、反码的一些东西
我们这里统一都以byte类型共8位 来进行说明:
我们都知道计算机是以二进制存储的,而且是以补码的形式存储的,而且:
- 正整数:补码 = 原码;
- 负整数:补码= 反码 + 1;
- 原码就是一个正整数的二进制,
- 反码是原码的符号位(即最高位,正数为0,负数为1)不变,其他各位取反(0变1,1变0);
废话不多说,举个例子大家就明白了,我们来看看9的源码,补码:
因为9是正数,所以补码=源码,根据上面的进制转换我们知道9的二进制是0b1001,所以以byte类型的存储方式就是:00001001,
所以 9的补码=源码=00001001
那-9的补码、源码、反码呢?
-9的源码就是符号位取1,其他各位与9的源码相同,所以就是:-9的源码=10001001,-9的反码=11110110,-9的补码=11110111,所以-9在计算机中以byte类型的存储形式就是11110111(-9的补码)
我们知道了十进制转换为原码,再转换为补码,那反过来呢?怎么由补码求出原码呢?
其实很简单,就是把上面的步骤倒过来就可以了,需要注意的就是:
- 如果补码的符号位(即最高位)为0,则为正数,此补码=原码;
- 如果补码的符号位为1,则表示负数,这时需要减1,再去反码,最后得到负数的原码。
我们来举个例子,补码为00101011,求其原码,
因为符号位为0,表示正数,所以该补码就是原码;
再来一个,补码为10101011,求其原码,
因为符号位为1,表示负数,所以先减1,得到10101010,再取反码 为11010101,这就是其原码,为负数
三、位运算(&、|、^、~)
位运算 | 运算规则 |
---|---|
& (按位与) | 全1则1,否则为0 |
| (按位或) | 全0则0,否则为1 |
^ (按位异或) | 相同为0,不同为1 |
~ (按位取反) | 遇0则1,遇1则0 |
<<(按位左移) | 将符号左边的数的二进制位依次左移(符号右边为移动位数) |
>> (按位右移) | 将符号左边的数的二进制位依次右移(符号右边为移动位数) |
- 注意的一点是,按位异或的运算是可逆的,一个数按位异或另一个数两次,得到原数,例如6 ^ 9 ^ 9 = 6; 运用此特性,按位异或有一个很重要的作用就是:不使用临时中介变量,就可以直接交换两个值,
int num1 = 5, num2 = 6;
num1 = num1 ^ num2;
num2 = num2 ^ num1; //此时num2 = 5
num1 = num1 ^ num2; //此时num1 = 6
之所以会这样,我们来分析一下:num2 = num2 ^ ( num1 ^ num2 ) = num1 ^ ( num2 ^ num2 ) = num1 ^ 0 = num1
,此时num2 == num1 == 5 ;
然后num1 = num1 ^ num2 = ( num1 ^ num2 ) ^ num2 = ( num1 ^ num2 ) ^ num1 = num2
,此时num == num2 == 6;
而且我们要清楚( num1 ^ num2 ) ^ num2
这个式子中第一个num2是原来的num2(即值为6),第二个num2已经是原来的num1(即值为5)了
我们再来说一下0的按位取反(~0)为啥等于-1 :
- 以byte类型来说明,0的补码为00000000,则~0后得11111111,我们要注意此时的11111111是在计算机中存储的,所以是补码形式,因为符号位位1,所以该数为负数,通过上面讲过的补码转换为原码的步骤,可得原码为10000001,该原码也就是十进制中的-1了
那1的按位取反(~1)为啥等于-2呢?
- 其实跟上面的~0原理一样,我们同样以byte类型来说明,1的补码为00000001,按位取反后得到11111110,此时同样为补码的形式存储,减1、再取反后 可得原码为10000010,也就是十进制中的-2
相关文章:

第三方物流是什么
第三方物流是指生产经营企业为集中精力搞好主业,把原来属于自己处理的物流活动,以合同方式委托给专业物流服务企业,同时通过信息系统与物流企业保持密切联系,以达到对物流全程管理的控制的一种物流运作与管理方式。 第三方物流…

ROS中cv_bridge如何用python3进行编译
最近遇到了个问题,cv_bridge实现了opencv和ros中图像数据类型的转换,但ros-melodic默认python版本是python2。在配置yolact环境的时候,要求是python3。 这就导致在ros自带的cv_bridge是python2版本,想使用python3的话需要自己去编…

Ansible06-管理roles
目录 一、roles的结构 二、RHEL系统roles 三、创建角色 四、部署角色 随着 playbook 的增多,有很多代码重用的机会。ansible 提供了一种方式——roles,只需将 roles 从一个项目复制到另一个项目,然后用 play 调用即可实现代码重用。这里的…

用Java中的HashSet写一个学生管理系统(添加、删除、修改、查询学生信息)
不废话,上代码: 先创建一个Student类: public class Student {private String id;private String name;private String mobile;private String address;public String getId() {return id;}public void setId(String id) {this.id id;}pub…

[BZOJ 2054]疯狂的馒头(并查集)
Description CQF十分喜欢吃馒头。兴奋之下他一下子买了N 个馒头请所有认识他的人吃。 但是CQF不喜欢白色,喜欢红色、黄色、绿色等鲜艳的颜色。于是他把所有白色的馒头排成一列。然后进行M 次染色操作。每个染色操作都是用一个神奇的刷子把连续的多个馒头染成特定的某…

RealSenseD435与ORB-SLAM2实现稠密建图
一、RealSenseD435介绍 RealSenseD435是一款结构光相机,使用左右目相机和红外光实现测距。有效测距范围为0.2~10m 二、ORBSLAM2_with_pointcloud_map的安装 git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.gitclone代码,无法…

使用appium做自动化测试时,send_keyss只能输入字母数字,无法输入中文
解决方案: driver中增加以下2行配置: "unicodeKeyboard":True, #unicode编码输入 "resetKeyboard":True #隐藏软键盘 转载于:https://www.cnblogs.com/Inbreeze/p/9828568.html

centos8安装KVM/QEUM虚拟化
centos8安装KVM/QEUM。安装虚拟化主机组。启动libvirtd服务。 yum groupinstall "Virtualization Host" systemctl enable libvirtd systemctl start libvirtd 谁可以使用虚拟化呢?加入libvirt组即可。 usermod -aG libvirt <username> 安装Vir…

病毒的灵魂拷问(绝对原创)
哈哈哈,我敢说,这篇博客绝不会有重复的,因为它是我上课的走神之作,哈哈哈! 不废话,上代码: import java.util.Scanner; import java.util.*; public class Test {public static void main(Str…
js:深入prototype(下:原型重写)
//当属性和方法特别多时,编写起来不是非常方便,能够通过json的格式来编写 //因为原型重写。并且没有通过Person.prototype来指定,此时的constructor不会再指向Person而是指向Object //假设constructor真的比較重要,能够在json中说…

全国所有省市县地理坐标Json格式
https://www.cnblogs.com/yzbubble/p/7707129.html转载于:https://www.cnblogs.com/loveMis/p/9829217.html

ubuntu设置不同的eigen版本
下载Eigen并进行编译 下载eigen库,创建build文件夹进行编译 设置安装路径 这里会设置make install的路径 随后进行make install 移动到usr/include路径下 找到第二步中安装的位置,移动到usr/include路径下 这样,需要用那个版本的eige…

MySQL01-安装mysql数据库
MySQL 可以从 YUM 源直接安装 rpm 包,但是这样的定制化程度低,不利于后期维护升级。因此,今天记录一种更灵活的二进制安装方式。参考 MySQL 5.7 官方文档 2.2 章节,具体做法和官方文档略有出入。 1、配置防火墙规则 firewall-cm…

SVO学习笔记(一)
SVO学习笔记(一)这篇文章FrameFeaturedetectionFeatrue_matcher三角测量求深度特征匹配非线性优化寻找匹配特征极线搜索匹配特征总结这篇文章 一个很年轻的叔叔踩进了SLAM的坑,现在正在学习视觉SLAM中的SVO系统。本着好记性不如烂笔头的思想&…

如何用eclipse操作MySQL数据库进行增删改查?
我们首先需要在Navicat Premium上创建一个数据库实例(test),然后创建一个stu_info表(id,name,mobile,address) 接着创建一个Test类进行操作: 在这之前需要导一个包&#…

机房测试10.22
wzz的观察 简单的递推。 \(f[i][j]\)表示以\((i,j)\)这个点为右下角时最大的正方形大小。 如果这个格子为0,\(f[i][j]0\) 否则\(f[i][j]min(f[i-1][j],f[i][j-1],f[i-1][j-1])1\) 或者可以二分答案,每一次\(O(n*m)\)进行check。 递推代码: #i…

$.when()方法翻译
地址:http://api.jquery.com/jQuery.when/ jQuery.when( deferreds ),returns Promise 正文 Description: Provides a way to execute callback functions based on zero or more Thenable objects, usually Deferred objects that represent asynchrono…

Anaconda3 离线安装 Django-3.2.7 及依赖项setuptools、sqlparse 、asgiref、typing_extensions等模块
目录 一、背景 二、离线安装 setuptools、sqlparse 、asgiref、typing_extensions等依赖模块 三、离线安装django 一、背景 因为信息安全管理的规定,这台服务器不能连接互联网,只能离线安装 django。anaconda3 安装完成以后,从默认虚拟环…

倍增LCA NOIP2013 货车运输
货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。…

SVO学习笔记(二)
SVO学习笔记(二)这篇文章稀疏图像对齐地图点投影(地图与当前帧间的关系)reprojectMapreprojectPointreprojectCell特征点对齐中的非线性优化结尾这篇文章 这次仍是关于SVO系统的学习记录(冲冲冲!)。这次的主要内容是sp…

用JDBC写一个学生管理系统(添加、删除、修改、查询学生信息)
首先需要用Navicat Premium创建一个student表 用Java连接好MySQL数据库(需要copy一个mysql-connector-java-5.1.44-bin.jar包,该包可在网上找到)后,我们开始用Java写一个学生管理系统: 我们首选需要定义好添加、删除、…

tensorflow在训练和验证时监视不同的summary的操作
如果想在训练和验证时监视不同的summary,将train summary ops和val summary ops放进不同的集合中即可。 train_writer tf.summary.FileWriter(log_dir /train, sess.graph) val_writer tf.summary.FileWriter(log_dir /val, sess.graph)# 假设train_loss和val_l…

Anaconda3 离线安装和配置 Django-3.2.7 使用 MySQL-5.7 数据库
Django文档 Settings / Core Settings / DATABASES 一节阐述了django与数据库交互配置的内容。 先在 MySQL 5.7 版本数据库中创建一个名为 learning_log_db 的数据库,和名为 myuser 的用户,并分配权限。 create databases learning_log_db; create use…

用JDBC写一个学生管理系统(添加、删除、修改、查询学生信息)(二)
本文上接用JDBC写一个学生管理系统(添加、删除、修改、查询学生信息) 这次主要是对上一文中的查询方法做一下调整,用创建内部类的方法来实现学生信息的查询。 我们先要定义一个接口IRowMapper: import java.sql.ResultSet;public…

(原)ubuntu中使用conda安装tensorflow-gpu
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/9834567.html 参考网址: https://www.anaconda.com/blog/developer-blog/tensorflow-in-anaconda/ 之前的一篇,直接安装tensorflow的: https://www.cnblogs.com/darkknig…
SVO中 Inverse Compositional Image Alignment方法的学习笔记
SVO中 Inverse Compositional Image Alignment方法的学习笔记这篇文章光流法简介逆向光流法结尾这篇文章 在SVO系统中的"Relaxation Through Feature Alignment"部分使用的是一种特别的LK光流法:the inverse compositional Lucas-Kanade algorithm&#x…

Head First设计模式之目录
只有沉淀、积累,才能远航;沉沉浮浮,脚踏实地。 这本书已经闲置了好久,心血来潮,决定写个目录,让自己坚持看完这本书 创建型模式 抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创建相关或依赖…

HANA 数据库备份hang住的解决办法
今天遇到 HANA 数据库备份hang住的情况。经过查 SAP NOTE 解决,记录一下过程。两个NOTE如下: 2452735 - HANA Backup failing with "[447]: backup could not be completed: [110122] A data backup cannot be created because another data backu…

简单DP【p2642】双子序列最大和
Description 给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出最大和。一个连续子序列的和为该子序列中所有数之和。每个连续子序列的最小长度为1,并且两个连续子序列之…

JDBC工具类
本文主要是将JDBC最基础的增删改查的工具类的代码详细的罗列出来: 一、我们先来看一看项目结构: 二、配置JDBC工具类 1.我们先处理异常 我们知道几乎不可能一次性就写出完美的代码,都是要经过很多次的调试才行,那在调试过程中就难免会出现…