计算机编码:

  • 原码

符号位为0表示正数,为1表示负数;

其余各位等同于真值的绝对值。

如:0000 0000 0000 0010 =2,1000 0000 0000 0010 =-2

  • 反码

符号位的用法及正数的表示与“原码”一样;

负数的表示是在“原码”表示的基础上通过将符号位以外的各位取反来获得的。

如:0000 0000 0000 0010 = 2,1111 1111 1111 1101 = -2

  • 补码

符号位的用法及正数的表示与“原码”一样;

负数的表示是在“反码”的基础上通过加1来获得的。

如:0000 0010 = 2,1111 1110 = -2

计算机中负数的表示均用补码,负数参与的运算得到的也是补码

位运算符:

& 与。    全1为1, 有0为0。  任何数与0与都等于0。  

| 或。      有1为1, 全0为0。  任何数与0或都等于原值。

~ 非。     逐位取反

^ 异或。  相同为0,相异为1。      任何数与0异或都等于原值。

Java基本类型的字节长度

java基本类型的的字节长度与具体的软硬件环境无关。Java中的char类型用Unicode码储存。

各个类型长度为:

byte : 1

short : 2

char : 2

int : 4

long : 8

float : 4

double: 8

boolean : 1

java各个类型的二进制编码实例(System.out.println(Integer.toBinaryString(i));)

int i = 1;

二进制表示为:(原码)

00000000 00000000 00000000 00000001

int i = -1;

二进制表示为:(补码)

11111111 11111111 11111111 11111111

long l = 1;

二进制表示为:

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001

特别注意:

负数都是用补码表示并参与运算的。得到的也是补码,需要减1取反获得原码。

位运算事例

-1^1,

-1

1000 0000 0000 0000 0000 0000 0000 0001--原码

1111 1111 1111 1111 1111 1111 1111 1110--反码

1111 1111 1111 1111 1111 1111 1111 1111--补码

1

0000 0000 0000 0000 0000 0000 0000 0001--原码

则-1^1等于

1111 1111 1111 1111 1111 1111 1111 1111^

0000 0000 0000 0000 0000 0000 0000 0001=

1111 1111 1111 1111 1111 1111 1111 1110--补码

1111 1111 1111 1111 1111 1111 1111 1101--反码

1000 0000 0000 0000 0000 0000 0000 0010--原码

即-1^1=-2

移位运算:

  • 逻辑左移 <<

右边补0,符号位就是被移动到的位.

正数:

x<<1一般相当于2x,但是可能溢出.

若x在这个范围中: 2的30次方~(2的31次方-1) 二进制表示 0100...0000到0111...1111,<<后最高为变为1了,变成负数了.

负数:

x<<1一般也相当于2x,也有可能溢出.

若x在这个范围中: -2的31次方~-(2的30次方+1)二进制表示1000...0000到1011...1111,<<后最高为变成0了,变成正数了.

  • 算术右移 >>

为正数时左边补0,为负数时左边补1.

x>>1,相当于x/2,余数被舍弃,因为这个是缩小,所以不会溢出.

不过有一点要注意: -1右移多少位都是-1.(因为负数都是用补码表示,-1永远是 11111...)

另外舍弃的余数是正的:

3>>1=1  舍弃的余数是1.

-3>>1=-2 舍弃的余数也是1,而不是-1.

对于正数 x>>1和x/2相等

对于负数 x>>1和x/2不一定相等.

  • 逻辑右移 >>>

这个把符号位一起移动,左边补0

对于正数,>>>和>>是一样的

对于负数,右移之后就变成正数

对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。

但在进行逻辑右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,

得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。

但“零扩展”不会发生,所以在那些情况下会得到-1的结果。

 

           int i = -1;

                   i >>>= 10;

                   System.out.println(i);

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

                   long l = -1;

                   l >>>= 10;

                   System.out.println(l);

                   System.out.println(Long.toBinaryString(l));

                   short s = -1;

                   s >>>= 10;

                   System.out.println(s);

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

                   byte b = -1;

                   b >>>= 10;

                   System.out.println(b);

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

输出结果

4194303

0000 0000 0011 1111 1111 1111 1111 1111

18014398509481983

0000 0000 0011 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111

-1

1111 1111 1111 1111 1111 1111 1111 1111

-1

1111 1111 1111 1111 1111 1111 1111 1111

一道诡异的移位题

int i=-1;
  int j=i>>>32;
  System.out.println(j);

输出结果为 -1

JAVA进行移位运算中因为int是占32位,进行移位的数是32的模,所以当i>>>32的时候就等于i>>>0,相当于没有进行移位.

位运算及在java中的应用整理的更多相关文章

  1. 位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题

    转自:https://blog.csdn.net/monster_girl/article/details/52928864 在学习完位操作后,经常会遇到一类关于查找缺失整数的问题. 第一类是给你一个 ...

  2. java中的IO整理

    写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...

  3. java中反射学习整理

    转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序能够訪问.检測和改动它本身的状态或行为的一种能力. jav ...

  4. java中的反射整理

    1,什么是反射 反射机制是java语言提供的一种基础功能,它能够赋予成语在运行时进行自省的能力.通过反射我们可以直接操作类或者对象,例如:可以通过反射去获取某个对象的类的定义,属性,方法,还可以修改类 ...

  5. java中的String整理

    基础知识模块: 参考以下博客,写得很好,深入分析了String,需要重点掌握 http://www.tiantianbianma.com/java/java-basic/page/3/ http:// ...

  6. 【转】 Java中的IO整理

    写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...

  7. Java中Iterator用法整理

    迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的I ...

  8. Java中vector用法整理

    ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创 ...

  9. Java中并发问题整理

    1. java中有几种方法可以实现一个线程? 使用Runnable,Callable,Thread或者线程池 2. 如何停止一个正在运行的线程? 可以使用正在运行的线程,支持线程中断,通常是定义一个v ...

随机推荐

  1. 2.5 Local Methods in High Dimensions

    curse of dimensionality 输入在p维立方体中符合均匀分布,如果需要覆盖比例r的体积,需要每个维度上\(e_p(r)=r^{1/p}\) \(e_{10}(0.01)=0.63,e ...

  2. Linux学习笔记6-Linux根目录下各个目录的作用

    /bin:存放最常用命令:  /boot:启动Linux的核心文件: /dev:设备文件: /etc:存放各种配置文件: /home:用户主目录: /lib:系统最基本的动态链接共享库: /mnt:一 ...

  3. hdu 4775 Infinite Go(暴力)

    pid=4775" target="_blank" style="">题目链接:hdu 4775 Infinite Go 题目大意:两个人下围棋 ...

  4. 【并查集+拓扑排序】【HDU1811】【Rank of Tetris】

    题意:给你3种关系 A=B,A>B,A<B 问是否排名方式唯一,或者存在矛盾 解 1.读入数据先处理 =号 用并查集的祖先作为代表元素,其他儿子节点都等于跟这个点重叠. 再读入 '< ...

  5. IE下图片切换的时候,图片总是切换不成功---根本问题是IE缓存图片

    作为WEB设计者,为了在网页展示上加强用户体验,经常会利用图象载入显示状态方法,这自然需要Image对象的onload事件. 在firefox浏览器下完成开发后,可是在IE浏览器中进行调试总不能被调用 ...

  6. Windows系统的安装

    一.写在前面        笔者最近因为换工作,在家待业甚感无聊,于是想要整理一些在Windows系统的一些安装方法和下载资源,一来给自己做个备忘,二来把一些不成熟的想法分享出去,希望大家予以指正. ...

  7. UVA 10603 Fill

    题意: 题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量.一开始只有第三个水杯是满的,剩下的水杯是空的.倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满. ...

  8. Android应用开发基本流程及测试运行

    (1)Android App工程项目的创建 File—New—New Project 设置项目.程序包的名称 设置项目名称为MyDiary,程序包名为org.socrates.mydiary.acti ...

  9. MVC 传参

    介绍一些View中常用的东西 1:传递参数: 1):路由协议中传递参数: 1):eg:比如是这样类似的路由协议,那么我们在传递参数的时候,就要传递 id过去,当然如果,ABCD= UrlParamet ...

  10. [Oracle]日期和毫秒转换(Date->int)

    --日期转换毫秒  SELECT TO_NUMBER(TO_DATE('2005-03-29 12:30:45', 'YYYY-MM-DD HH24:MI:SS') -  TO_DATE('1970- ...