计算机原码、补码、反码与java移位运算符(<</>>/>>>)
一、机器值和真值
1.机器值
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
那么,这里的 00000011 和 10000011 就是机器数。
2.真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
3.原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。原码取值范围:【11111111,011111111】即【-127,127】
4.反码
正数的反码是其本身。
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
5.补码
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
深入了解
注:
- 机器都是使用补码,运算也是使用补码。
- 正数的原码、补码、反码都一样。
- 补码与原码相互转换,其运算过程是一样的。
1.左移运算符
左移的规则只记住一点:丢弃最高位,0补最低位
左移一位相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
运算方式:数值的补码全部往左移动X位,符号位和最高位都舍弃,最低位补0。
正数:
int a = 5 ;
int b = a << 2 ;(5*22=20)
[ 0000 0000 0000 0000 0000 0000 0000 0101 ] 5的补码
[ 0000 0000 0000 0000 0000 0000 0001 0100 ] 对于正数而言,反码就是原码,即 20
负数:
int a = -5 ;
int b = a << 2 ;(-5*22=-20)
[ 1000 0000 0000 0000 0000 0000 0000 0101 ] -5的原码
[ 1111 1111 1111 1111 1111 1111 1111 1010 ] -5的反码
[ 1111 1111 1111 1111 1111 1111 1111 1011 ] -5的补码
[ 1111 1111 1111 1111 1111 1111 1110 1100 ] a<<2左移2位
将补码转换成原码就可以得到数值,补码转原码和原码转补码一样,符号位不变,其余位取反加一。
[ 1000 0000 0000 0000 0000 0000 0001 0011 ]
[ 1000 0000 0000 0000 0000 0000 0001 0100 ] 得到a<<2的原码,即 -20
2.右移运算符
右移的规则只记住一点:符号位不变,左边补上符号位。
右移一位相当于除以2的1次方,右移n位就相当于除以2的n次方。
运算方式:数值的补码向右移X位,符号位不变(左边补上符号位)。
与左移差不多,这里就不列出具体案例了。
3.无符号右移
无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位
无符号右移规则和右移运算是一样的,只是填充时不管左边的数字是正是负都用0来填充,无符号右移运算只针对负数计算,因为对于正数来说这种运算没有意义
用移位操作可以极大地提高性能,因为在计算机底层对位的操作是最快。
有些是自己写的,有些是COPY的,方便以后的查看。
计算机原码、补码、反码与java移位运算符(<</>>/>>>)的更多相关文章
- C正数负数的原码补码反码以及内存地址分析
#include<stdio.h> void swap(int a, int b); void main1(){ int i = 10; //正数的原码 00000000 00000000 ...
- java原码、反码、补码、位运算
1.对于有符号的数(java中的数都是有符号的) 二进制的最高位是符号位:0表示正数,1表示负数 正数的原码,反码,补码都一样 负数的反码=它的原码符号位不变,其它位取反 负数的补码=它的反码+1 0 ...
- java 变量及数据类型、原码、反码、补码
Java基础——变量及数据类型 变量的概念 内存中的一个存储区域 变量名+数据类型 可在同一类型范围内不断变化 为什么定义变量: 用于不断的存放同一类型的常量,并可以重复使用 使用变量注意: 变量的作 ...
- Java:二进制(原码、反码、补码)与位运算
一.二进制(原码.反码.补码) 二进制的最高位是符号位(“0”代表正数,“1”代表负数): Java中没有无符号数: 计算机以整数的补码进行运算: 1. 原码:将一个整数转换成二进制表示 以 int ...
- Java 数字用二进制表示,以及原码,反码,补码、负数的二进制表示
首先我们要对原码.反码和补码有个了解: 1.所谓原码就是二进制定点表示法,即最高位为符号位,"0"表示正,"1"表示负,其余位表示数值的大小. 2.反码表示法规 ...
- 二进制原码、反码、补码以及Java中的<< 和 >> 和 >>> 详细分析
1.计算机二进制系统中最小单位bit 在计算机二进制系统中: bit (位) :数据存储的最小单元. 简记为b,也称为比特(bit),每个二进制数字0或1就是一个位(bit),其中,每 8bit = ...
- 原码,反码与补码的概念以及Java中数的存储方式
*原码,反码,补码必须满8位,不足在前填0: 1,原码:用符号位和数值位表示一个带符号的数 + -> 0 - -> 1 表示数的范围-127~ ...
- (7)java基础知识-原码、反码、补码、运算符
一.原码.反码.补码 原码 一个数转化成二进制. 用最高位来表示正负,最高位为0表示正数,最高位为1表示负数. 例如: short i=5: 因为在java里short占2个字节转化成二进制就是 00 ...
- Java学习--反码 原码 补码简析
关于课上实验中对小数的处理中出现的问题涉及到原码,反码,补码的问题,所以在网上进行了一下搜索.在原码,反码,补码中的解释可得知,无论是哪一种码,能够表示的数的范围是-2^(位数-1)+1至2^(位数- ...
随机推荐
- C# MethodInvoker委托的使用
一.MethodInvoker是什么? MethodInvoker 表示一个委托,该委托可以执行托管代码中声明为void且不接受任何参数的任何方法.在对控件的 invoke 方法进行调用时或需要一个简 ...
- slice,substring,substr的区别
1.都为正整数//例子数据 var arr = [1,2,3,4,5,6,7], var str = "helloworld!"; //注意这里有个!号也算一位若有空格,空格也算一 ...
- java(第十五章)
一.字符串类String 1.String是一个类,位于java.lang包中 2.创建一个字符串对象的2种方式: String 变量名=“值”; String 对象名=new String(“值”) ...
- PHP取凌晨时间戳
百度出来的没一个正确答案 在此纠正 strtotime('today midnight'); // 今天凌晨时间戳 strtotime('+1 day midnight'); // 明天凌晨时间戳
- Windows操作系统下搭建Git服务器和客户端。
本文将介绍如何在Windows操作系统下搭建Git服务器和客户端.服务器端采用的是Bonobo Git Server,一款用ASP.NET MVC开发的Git源代码管理工具,界面简洁,基于Web方式配 ...
- ava、Python和PHP三者的区别
Java.Python和PHP三者的区别 2017年07月15日 22:09:21 书生_AABB 阅读数:18994 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- android LogConfigurator
android LogConfigurator 此为第三方的 Log日志
- Scrapy中间件user-agent和ip代理使用
一.定义实现随机User-Agent的下载中间件 1.在middlewares.py中完善代码 import random from Tencent.settings import USER_AGEN ...
- 在当前TestSuite/TestCase run之前先run另一个TestSuite/TestCase
在当前的TestSuite/TestCase的Setup Script里面写上这段代码: import com.eviware.soapui.model.support.PropertiesMap l ...
- easyui datagrid 后台返回所有数据,前台分页
function pagerFilter(data) { if (typeof data.length == 'number' && typeof data.splice == 'fu ...