学习移位运算,首先得知道参与移位运算的类型的位数,那先来复习下Java基础类型的占位数吧。

  • Java基础类型
Java基础类型总结一览表
类型 二进制位数 最大值 最小值 初始化值 表示形式 带符号
char 8 127(2^7-1) -128(-2^7) 0 二进制补码
short 16 32767(2^15 - 1) -32768(-2^15) 0 二进制补码
int 32 2,147,485,647(2^31 - 1) -2,147,483,648(-2^31) 0 二进制补码
long 64 9,223,372,036,854,775,807(2^63 -1) -9,223,372,036,854,775,808(-2^63) 0L 二进制补码
float 32 3.4028235E38 1.4E-45 0.0f IEEE 754标准的浮点数
double 64 1.7976931348623157E308 4.9E-324 0.0f IEEE 754标准的浮点数
boolean 待定分析 只有true 和false 只有true 和false false JVM中用0/1表示  

float和double的区别在于一个是单精度的浮点数,一个是双精度的浮点数。

浮点数是机器内部的指数型的一种表示,可以分解为四个部分:数符号,尾数,指数符号,指数

数符号位指数符号位都是占一位,表示正负。

对于float,指数部分占8位,其中指数符号一位,指数值部分占7位,尾数部分占24位;对于double,指数部分占16位,指数部分占15位,尾数部分占48位。所以double比float表示的数更大更精准,但与此同时带来的是两倍的内存消耗。

boolean占多数位的问题要看情况而论,再JVM中,对布尔值的操作都是替换成int型了,所以是占用32位;如果定义的是布尔型的byte数组,则JVM将其编译为byte数组类型,这时候占用了8位。其实这里也听疑惑的,为啥一个boolean可以一会占8位,一会占32位呢?个人理解感觉是在真正表示boolean的时候,应该都是只有1位,非0即1,但是具体编译的时候其他占用位可能是用来做其他用途。

好了,接下来,来看看移位运算的问题了。

Java的移位运算符包括三种:、>>(带符号右移)和>>>(无符号右移)。

  • 左移运算符    <<

用法:value << number

原则:丢弃最高位,低位补0

注意事项:char,byte和short型在移位时,会先转换为int型,然后再进行移位操作;

当移动位数超过移动数value的位数时,会做一个取模操作,例如45<<34,则具体移动时是移动2位,因为34%32=2。

实例:

1. 例子程序

public class Test {
public static void main(String args[]) { int num =0x40000000;
System.out.println(num);
num = num << 1;
System.out.println(num);
}
}

2. 程序结果

1073741824
-2147483648

选取了一个典型用例,该例子说明,符号位也会连同一起移动,数字位如果为1且移动到了符号位,会将数变为负数。

  • 带符号右移    >>

用法:value >> number

原则:符号位不变,左边依次补上符号位,且与此同时最低位要舍弃

注意事项:char,byte和short型在移位时,会先转换为int型,然后再进行移位操作;

当移动位数超过移动数value的位数时,会做一个取模操作,例如45<<34,则具体移动时是移动2位,因为34%32=2。

实例:

1. 例子程序

public class Test {
public static void main(String args[]) { int num1 =0x80000000;
int num2 = 0x00000003;
System.out.println(num1);
System.out.println(num2);
num1 = num1 >> 2;
num2 = num2 >> 1;
System.out.println(num1);
System.out.println(num2);
}
}

2. 运行结果

-2147483648
3
-536870912
1

num1说明了符号会跟着往右边跑,带符号移动。

num2说明了低位在舍弃,由3变为1了。

  • 无符号右移    >>>

用法:value >>> number

原则:符号位不变,左边依次补上0,且与此同时最低位要舍弃

注意事项:char,byte和short型在移位时,会先转换为int型,然后再进行移位操作;

当移动位数超过移动数value的位数时,会做一个取模操作,例如45<<34,则具体移动时是移动2位,因为34%32=2。

实例:

1. 例子程序

public class Test {
public static void main(String args[]) { int num1 =0x80000000;
int num2 = 0x00000003;
System.out.println(num1);
System.out.println(num2);
num1 = num1 >>> 1;
num2 = num2 >>> 33;
System.out.println(num1);
System.out.println(num2);
}
}

2. 运行结果

-2147483648
3
1073741824
1

从num1可以看出符号位也当做数字位跟着一起移动了

【原创】Java移位运算的更多相关文章

  1. java 移位运算

    移位运算 :将整数转化为二进制(以补码的形式),按位平移. <<     左移 >>     右移 >>>   无符号右移 << 右移: 按位做平 ...

  2. [JAVA]移位运算(左移<<,右移>>和无符号右移>>>)

    一.背景知识 整数在内存中是以二进制的形式存在的,而且存的是该整数的补码.最高位代表符号位,正数为0,负数为1 正数的补码是其二进制本身,负数的补码则是 符号位保持1不变,其他位按位取反再加1,+0和 ...

  3. Java移位运算

    java中移位运算符有三种“<<”.“>>”.“>>>”,没有“<<<”运算符. “<<”运算符将二进制位进行左移,低位用0来填 ...

  4. Java 移位运算、符号位扩展

    类型取值范围 short 是1字节,即8位.而且 Java 中只有有符号数,所以最大值 0111,1111=2^7-1. 同时计算机中以补码形式存负数,所以可以多表示一个数,则最小值 1000,000 ...

  5. java移位运算的用途

    参考下面这篇文章 http://blog.csdn.net/gaowen_han/article/details/7163104 http://jinguo.iteye.com/blog/540150 ...

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

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

  7. Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

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

  8. Java中的位运算符、移位运算

    一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&)  :两位全为1,结果为1,否则为0: (2)按位或  (|)   :两位有一个为1,结果为1,否则为0: (3) ...

  9. java中位运算和移位运算详解

    一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算        分别看一下正数和负数的具体运算步骤 ...

随机推荐

  1. Centos 7 通过YUM安装 PHP7 NGINX1.1.8 POSTGRESQL9.5

    转载 1.最小化安装CENTOS7 2.更新源: yum update reboot 3.安装扩展源: yum install epel-release 4.安装工具软件: yum install w ...

  2. Smlusm随笔目录索引

    1.MVVM Light Toolkit ) [转]Mvvm Light Toolkit for wpf/silverlight系列之搭建mvvmlight开发框架 2) [转]Mvvm Light ...

  3. Vijos P1063 迎春舞会之交谊舞 DP

    题目链接:https://vijos.org/p/1063 题意:有n(n <= 100)行,每行有2*i-1个可显字符'#'与'-',组成一个倒三角形,问由'-'组成的最大三角形的'-'的个数 ...

  4. SDC(4)–set_clock_groups 与–add选项

    1,set_clock_groups  -exclusive 有多个时钟,但是多个时钟不会同时生效 例如: 2,-add 只有一个时钟输入源,但是始终的频率等可能变 例如:

  5. 【已解决】Vmware无法创建虚拟网卡的问题

    最近因为各种需要,要在虚拟机里使用桥接方式连接.但是不管怎么操作,都无法添加虚拟网卡.连续好多天需要用到桥接上网,今儿多方搜索,找到了解决方案. 参考资料:http://tieba.baidu.com ...

  6. Python之创建tuple

    tuple是另一种有序的列表,中文翻译为" 元组 ".tuple 和 list 非常类似,但是,tuple一旦创建完毕,就不能修改了. 同样是表示班里同学的名称,用tuple表示如 ...

  7. Temporary Post Used For Theme Detection (da655c32-bc15-41ad-bf89-e76c1ec1bea7 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

    This is a temporary post that was not deleted. Please delete this manually. (997facfe-d420-4437-a222 ...

  8. 【转】spring3 MVC实战,手工搭建Spring3项目demo

    更新:这几天对spring3的理解又进了一步,今天抽空把这篇文章中的错误和不当之处做了修改. 最近的项目在用Spring3,涉及到了基于注解的MVC,事务管理,与hibernate的整合开发等内容,我 ...

  9. DHTMLX 前端框架 建立你的一个应用程序 教程(九)--绑定表单Form到表格Grrid中

    绑定表单Form到表格Grrid中 现在我们需要选中一行表格数据的时候 数据能在表单中显示出来 我们可以使用DHTMLX 丰富的组件功能实现它. 绑定表单到表格 1.调用bind方法将表单绑定到网格, ...

  10. 捉虫记:SHGetSpecialFolderPath返回错误码为2

    通常我们想获得系统的一些路径时,都会使用一些Shell函数.比如SHGetSpecialFolderPath,SHGetFolderPath,SHGetKnownFolderPath等,传入我们想要的 ...