韩顺平 java 第二十讲 二进制、位运算、移位运算符

原创 2015年09月26日 17:19:32

计算机二进制中的原码、补码、反码

计算机内部处理的信息都是采用二进制数来表示。进位规则是“逢二进一”
int a = 1;
int类型是4个字节,一个字节等于八个bit。所以一共32bit。


重点内容

  • 二进制的最高位是符号位,0代表正数,1代表负数
  • 正数的原码补码反码都一样
  • 负数的反码=它的原码符号位不变其他位取反
  • 负数的补码=它的反码+1
  • 0 的反码、补码都是0
  • java没有无符号数,也就是说java中的数都是有符号的
  • 在计算机计算的时候,都是以补码的方式来运算的

例子:模拟计算机计算1-2的过程

相当于:1+(-2)
1的补码:0000……0001
-2的原码:1000……0010
-2的反码:1111……1101
-2的补码:1111……1110
所以:1和-2的补码相加:
得到:1111……1111
结果是补码。结果如果是正数的话,原码就是结果;但这个结果是负数,所以还要装换成原码:
结果的补码:1111……1111
结果的反码:1111……1110
结果的原码:1000……0001
也就是-1!

位运算符和移位运算符

  • 这些操作都是准对补码来说的,操作之前都要转换成补码
  • 4个位运算,分别是:按位与&、按位或|、按位异或^、按位取反~;这几个运算都是针对补码来运行的。
  • 3个移位运算:算数左移<<(低位溢出,符号位不变,并用符号位补溢出的高位);算数右移>>(符号位不变,低位补零);逻辑右移>>>(低位溢出,高位补零)

求下列输出结果:

int a = 1>>2;
//结果:0
//1的补码:0000……0001
//右移两位:0000……0000(符号位为0)
int b = -1>>2;
//结果:-1
//-1的原码:1000……0001
//-1的反码:1111……1110
//-1的补码:1111……1111
//所以-1右移多少位都是-1
int c = 1<<2;
//结果:4
//相当于乘以二
int d = -1<<2;
//结果:-4
//-1的补码:1111……1111
//左移2位:1111……1100
//结果的反码:1111……1011
//结果的原码:1000……0100
//也就是-4
int e = 3>>>2;
//结果:0
//3的补码:0000……0011
//逻辑右移3位:0000……0000
int a = ~2
//结果是:-3;过程如下:
//2的补码是:0000……0010
//取反之后是:1111……1101
//很明显这个是负数的补码,要转换成原码:
//结果的反码是:1111……1100
//结果的原码是:1000……0011
//也就是-3
int c = 2&3
//两个都是正数
//2的补码:0000……0010
//3的补码:0000……0011
//&之后:  0000……0010
//这个也是结果的原码,就是2
int d = 2|3
//这个同上个,结果是:3
int e = ~-5
//-5原码:1000……0101
//-5反码:1111……1010
//-5补码:1111……1011
//取反:   0000……0100
//是正数,所以结果是:4
int f = -3^3
//-3 的原码:1000……0011
//-3反码:1111……1100
//-3补码:1111……1101
//3补码:0000……0011
//然后二者异或:1111……1110(补码,负数:还需要转换成原码)
//结果的反码:1111……1101
//结果的原码:1000……0010
//也就是:-2
  • 如何用最快的方法判断一个数是2的n次方?移位运算
  • 如果用最快的方法将一个数变成原来的二倍?移位运算
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

韩顺平位运算

  • 2014年01月13日 14:43
  • 45KB
  • 下载

java 二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是...

JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)

一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是...
  • kyp23
  • kyp23
  • 2017年07月18日 13:45
  • 50

Java学习_06_二进制、位运算&移位运算、集合框架

集合框架
  • BonJean
  • BonJean
  • 2014年08月20日 13:35
  • 595

JAVA二进制.位运算.移位运算

二进制、位运算、位移运算 思考题 1、请看下面的代码段,回答a,b,c,d,e结果是多少? public static void main(String []args){ int a=1>>2...

韩顺平 java 第一讲 内容介绍,项目演示,原理剖析

课程介绍 java面向对象编程 java图形界面 java数据库编程 java文件io流 java网络编程 java多线程 java是什么?java是一种语言。人和计算机交流,用到编程语言。java开...

韩顺平 java 第25讲、第26讲 泛型

泛型 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 在没有泛型的情况下,通过对类型Object的引...

韩顺平 java 第13讲第14讲 抽象类、接口、final

抽象类为什么存在抽象类?当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法(也就是抽象方法),用abstract来修饰该类。 比如之前的Animal类,可以这么定义:abstrac...

韩顺平 java 第十二讲 多态

什么是多态?就是指一个引用(类型)在不同情况下的多种状态。 也可以这么理解:多态是指通过指向父类的指针,来调用在不同子类中实现的方法。 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继...

韩顺平java从入门到精通第59讲,建立数据库代码

create table emp ( empno int primary key, ename nvarchar(30), job nvarchar(30), mgr int, h...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:韩顺平 java 第二十讲 二进制、位运算、移位运算符
举报原因:
原因补充:

(最多只允许输入30个字)