【原创】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移位运算的更多相关文章
- java 移位运算
移位运算 :将整数转化为二进制(以补码的形式),按位平移. << 左移 >> 右移 >>> 无符号右移 << 右移: 按位做平 ...
- [JAVA]移位运算(左移<<,右移>>和无符号右移>>>)
一.背景知识 整数在内存中是以二进制的形式存在的,而且存的是该整数的补码.最高位代表符号位,正数为0,负数为1 正数的补码是其二进制本身,负数的补码则是 符号位保持1不变,其他位按位取反再加1,+0和 ...
- Java移位运算
java中移位运算符有三种“<<”.“>>”.“>>>”,没有“<<<”运算符. “<<”运算符将二进制位进行左移,低位用0来填 ...
- Java 移位运算、符号位扩展
类型取值范围 short 是1字节,即8位.而且 Java 中只有有符号数,所以最大值 0111,1111=2^7-1. 同时计算机中以补码形式存负数,所以可以多表示一个数,则最小值 1000,000 ...
- java移位运算的用途
参考下面这篇文章 http://blog.csdn.net/gaowen_han/article/details/7163104 http://jinguo.iteye.com/blog/540150 ...
- JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
- Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
- Java中的位运算符、移位运算
一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&) :两位全为1,结果为1,否则为0: (2)按位或 (|) :两位有一个为1,结果为1,否则为0: (3) ...
- java中位运算和移位运算详解
一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 ...
随机推荐
- 要成为开发中最牛逼的测试,测试中最牛逼的开发。从今天起学python,写博客。--python基础学习(一)
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32Type & ...
- SSH搭建完美CURD,含分页算法
今日开始研究使用java平台上的框架解决web服务端的开发. 这是一个完整的SSH实例,在马士兵老师的SSH整合代码基础上,增加用户的增删改查,同时实现structs方式的分页 放出源代码供大家学习参 ...
- hive与hbase的区别与联系
共同点:1.hbase与hive都是架构在hadoop之上的.都是用hadoop作为底层存储 区别:2.Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBa ...
- 【TLD】标签库描述符
tld是taglib description 的缩写 定制标签拼图中的最后一块是TLD(标签库描述符)文件.创建的每个标签都必须在一个TLD文件中声明,而且这一文件还必须连同标签的Java处理器类一起 ...
- BZOJ 1227 虔诚的墓主人
Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己 ...
- Nhibernate配置和访问数据问题
今天开始用Nhibernate做为自己的ORM,但是做的过程中确实遇到了好多问题,现在将问题收集起来以防日后出现相同的问题, 总结下: 这就是我的整个项目,现在配置下hibernate.cfg.xml ...
- codeforces 392B Tower of Hanoi
把前n个碟子从第一个塔移动到第三个塔有两种方法: 1.把前n-1个移动到第二个塔,把第n个移动到第三个塔,然后把前n-1个从第二个移动到第三个: 2.把前n-1个移动到第三个塔,把第n个移动到第二个塔 ...
- csuoj 1353: Guessing the Number
这个题我想到要用kmp找到循环节: 但是后面的我就不会做了: 看到题解才知道是字符串的最小表示: #include<cstdio> #include<cstring> #inc ...
- conky 配置变量表
转自conky 配置变量表 项目主页:http://conky.sourceforge.net/ 文档说明:http://conky.sourceforge.net/docs.html Variabl ...
- [状压dp]POJ2686 Traveling by Stagecoach
题意: m个城市, n张车票, 每张车票$t_i$匹马, 每张车票可以沿某条道路到相邻城市, 花费是路的长度除以马的数量. 求a到b的最小花费, 不能到达输出Impossible $1\le n\le ...