文档章节

关于原码&反码&补码&移位运算详解

天堂之镜
 天堂之镜
发布于 2015/02/12 21:47
字数 954
阅读 63
收藏 0
点赞 0
评论 0

 移位运算详解


 
下面是负-2的补码,也是负数的内存中实际存储的形式。
 11111111111111111111111111111110
下面是-2的反码:
 11111111111111111111111111111101
下面是正2的原码:
 前面省略30个0:……10
 
##################
2的编码(原码)
 00000000000000000000000000000010
2右移1位后的原码(相当于除2)
 00000000000000000000000000000001
 
2的编码(原码)
 00000000000000000000000000000010
2无符号右移1位后的原码(相当于除2)
 00000000000000000000000000000001

################
负数有符号右移的步骤
-3的编码(补码):
 11111111111111111111111111111101
-3右移1位后的补码(有符号,负数补1,正数补0)
 11111111111111111111111111111110
 
-3的编码(补码):
 11111111111111111111111111111101
-3无符号右移1位后的补码(无符号都补0)
 01111111111111111111111111111110
 
########################
正数(-a)的编码(原码)
 01111110000000110000000000000000
负数a的编码(补码)
 10000001111111010000000000000000
负数a无符号右移(为正)后的编码(补码-并直接补0)
 01000000111111101000000000000000
 
负数a的编码(补码)
 10000001111111010000000000000000
负数a右移(仍然为负)的编码(补码)
 11000000111111101000000000000000
 
负数a的编码(补)
 10000001111111010000000000000000
负数a左移1位后(仍为负)的编码(补)
 00000011111110100000000000000000
 
 
 
总结:
 正数在内存中只有一种存在形式:原码。
 负数在内存中也只有一种存在形式:补码。
 只是人们发现,负数的编码可以由正数的编码(原)取反(反)再加1得到。
 正数的编码可以由负数的编码(补)减1(反)再取反(原)得到

 对于无符号右移,直接将正数(原)或负数(补)的编码从第一到第三十二依次右移,再在最最前端补0.
 对于有符号右移:
 正数:
  正数(原)的编码从第一到第三十二依次右移,再在最最前端补0
 负数:
  负数(补)的编码从第一到第三十二依次右移,再在最最前端补1
 
 左移都是在末尾补0。
 
 
 
 
 
java程序源代码:
 
 
 
package test03;
 
public class Test06_23 {
 
 

/**

  * int a = 0x81fd0000; // 1000 0001 1111 1101 0000 0000 0000 0000 a >>>= 1;

  * 变量a的值为:()。 (最高位为1)负数a,无符号右移后结果(直接补0)。 0100 0001 1111 1101 0000 0000 0000

  * 0000 01000000111111101000000000000000

  * 

  * 注意:负数在内在中永远是补码形式。只是人们发现,可以通过对正数的编码进行取反加1得到负数在内在中的形式。 也就是常说的负数以补码存在。

  * 

  * 

  * @param args

  */

 public static void main(String[] args) {

   byte b1 = 1;

   System.out.println(Integer.toBinaryString(b1));

   byte b = (byte) ~b1;

   System.out.println("下面是负-2的补码,也是负数的内存中实际存储的形式。");

   System.out.println(Integer.toBinaryString(b));

   System.out.println("下面是-2的反码:");

   System.out.println(Integer.toBinaryString(b - 1));

   System.out.println("下面是正2的原码:");

   System.out.println("前面省略30个0:……" + Integer.toBinaryString(~(b - 1)));

   System.out.println(b);

   System.out.println();

   System.out.println("##################");

   System.out.println("2的编码(原码)");

   System.out.println("000000000000000000000000000000"

   + Integer.toBinaryString(2));

   System.out.println("2右移1位后的原码(相当于除2)");

   System.out.println("0000000000000000000000000000000"

   + Integer.toBinaryString(2 >>> 1));

   System.out.println();

   System.out.println("2的编码(原码)");

   System.out.println("000000000000000000000000000000"

   + Integer.toBinaryString(2));

   System.out.println("2无符号右移1位后的原码(相当于除2)");

   System.out.println("0000000000000000000000000000000"

   + Integer.toBinaryString(2 >>> 1));

   System.out.println("################");

   System.out.println("负数有符号右移的步骤");

   System.out.println("-3的编码(补码):");

   System.out.println(Integer.toBinaryString(-3));

   System.out.println("-3右移1位后的补码(有符号,负数补1,正数补0)");

   System.out.println(Integer.toBinaryString(-3 >> 1));

   System.out.println();

   System.out.println("-3的编码(补码):");

   System.out.println(Integer.toBinaryString(-3));

   System.out.println("-3无符号右移1位后的补码(无符号都补0)");

   System.out.println("0" + Integer.toBinaryString(-3 >>> 1));

    

   System.out.println();

   System.out.println("########################");

   int a = 0x81fd0000;

   System.out.println("正数(-a)的编码(原码)");

   System.out.println("0" + Integer.toBinaryString(-a));

   System.out.println("负数a的编码(补码)");

   System.out.println(Integer.toBinaryString(a));

   System.out.println("负数a无符号右移(为正)后的编码(补码-并直接补0)");

   System.out.println("0" + Integer.toBinaryString((a) >>> 1));

   System.out.println();

   System.out.println("负数a的编码(补码)");

   System.out.println(Integer.toBinaryString(a));

   System.out.println("负数a右移(仍然为负)的编码(补码)");

   System.out.println(Integer.toBinaryString(a >> 1));

   System.out.println();

   System.out.println("负数a的编码(补)");

   System.out.println(Integer.toBinaryString(a));

   System.out.println("负数a左移1位后(仍为负)的编码(补)");

   System.out.println("000000" + Integer.toBinaryString(a << 1));

  

  }

}

 

© 著作权归作者所有

共有 人打赏支持
天堂之镜
粉丝 5
博文 6
码字总数 5734
作品 0
长沙
高级程序员
Java位运算符与移位运算符

位运算符 位运算符主要针对两个二进制数的位进行逻辑运算,它包括:与(&)、或(|)、非(~)、异或(^)** 运算规则: 计算机中的数字运算都是以补码的形式进行的,所以在做为运算时,首先将...

深情不及酒伴 ⋅ 2017/12/04 ⋅ 0

Java移位运算符总结

本文参考:java移位运算符详解 Java移位运算符有三种 << 左移运算符,value< >> 右移运算符,value>>num >>> 无符号右移运算符, value>>>num << 左移运算符。(value< 相当与2*2,即将2(v......

Mercy_丶 ⋅ 2016/06/27 ⋅ 0

原码, 反码, 补码 详解

一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最...

xunzaosiyecao ⋅ 2017/10/24 ⋅ 0

计算机存储数据的格式

概述 计算机存储的格式是二进制位,8个二进制位表示一个字节,在计算机中二进制位有原码,反码和补码的格式,下面分别介绍 原码:最高位表示符号位,正数0,负数1;其余7位表示数值因此,一字...

rockjh ⋅ 01/02 ⋅ 0

Java 基本类型与二进制数位的本质

1.Java中的基本类型以二进制补码的形式表示,最高位为符号位: 如12, 用二进制表示为:0000 1100 而-125, 用二进制表示为:1000 0011 另补充原码,反码,补码的含义:  原码:将一个整数,...

linsea ⋅ 2013/11/18 ⋅ 0

计算机只会加法,原码,反码,补码和移码的相关概念

计算机只会加法,原码,反码,补码和移码的相关概念 原文链接:http://blog.csdn.net/hanchaoman/article/details/5658022

长平狐 ⋅ 2012/09/03 ⋅ 0

原码 && 反码 && 补码

原码 && 反码 && 补码 一、原码 && 反码 && 补码 原码 原码是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为...

秋风醉了 ⋅ 2014/07/27 ⋅ 0

java byte数据类型详解

Java代码 public static String bytes2HexString(byte[] b) { String ret = ""; for (int i = 0; i < b.length; i++) { String hex = Integer.toHexString(b[ i ] & 0xFF); if (hex.length()......

buleberry ⋅ 2014/04/09 ⋅ 0

C语言/C++编程学习之二进制原码、反码和补码

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/17 ⋅ 0

小朋友学C语言(35):原码、反码、补码

一、机器数和真值javascript:void(null) 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1. 机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,...

翡翠森林Z ⋅ 2017/12/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部