位运算及在java中的应用整理
计算机编码:
- 原码
符号位为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中的应用整理的更多相关文章
- 位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题
转自:https://blog.csdn.net/monster_girl/article/details/52928864 在学习完位操作后,经常会遇到一类关于查找缺失整数的问题. 第一类是给你一个 ...
- java中的IO整理
写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...
- java中反射学习整理
转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序能够訪问.检測和改动它本身的状态或行为的一种能力. jav ...
- java中的反射整理
1,什么是反射 反射机制是java语言提供的一种基础功能,它能够赋予成语在运行时进行自省的能力.通过反射我们可以直接操作类或者对象,例如:可以通过反射去获取某个对象的类的定义,属性,方法,还可以修改类 ...
- java中的String整理
基础知识模块: 参考以下博客,写得很好,深入分析了String,需要重点掌握 http://www.tiantianbianma.com/java/java-basic/page/3/ http:// ...
- 【转】 Java中的IO整理
写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...
- Java中Iterator用法整理
迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的I ...
- Java中vector用法整理
ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创 ...
- Java中并发问题整理
1. java中有几种方法可以实现一个线程? 使用Runnable,Callable,Thread或者线程池 2. 如何停止一个正在运行的线程? 可以使用正在运行的线程,支持线程中断,通常是定义一个v ...
随机推荐
- python模块目录文件后续
1,新增PythonModule加载path Ruiy tip(关于python list[]数据库类型特殊你懂的!append(""),extend([""] ...
- Ubuntu 14.04 安装桌面
1.Ctrl+alt+T启动终端或者Ctrl+alt+F1登录字符界面,执行以下命令重新安装Ubuntu unity(Ubuntu基本桌面): sudo apt-get install ubuntu- ...
- ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
1.启动报错SQL> startupORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instanceORAC ...
- button属性值
AccessibilityObject 取得指定給控制項的 AccessibleObject. (繼承自 Control). AccessibleDefaultActionDescription 取得 ...
- css float笔记
float 1.破坏性,让设置了float属性的元素脱离文档流 2.包裹性:div设置了float之后,其宽度会自动调整为包裹住内容宽度,而不是撑满整个父容器.如果没有包裹性,如何实现文字环绕(flo ...
- Banner 切换
在线项目 : Banner 切换 时间 : 2个小时 (15:00 - 17:00)满分 : 100分------------------------------------------------ ...
- UVA 1603 Square Destroyer
题意: 给定一个火柴棒拼成的方格阵,然后去掉一些火柴棒,问至少再去掉几根火柴棒能够让图中一个正方形都没有. 思路: 1. 由于题目中给定了 n 的范围,2 * n * (n + 1) <= 60 ...
- 连接mysql数据库2+操作入门
package 对数据库操作Statment; import java.sql.Connection; import java.sql.DriverManager; import java.sql.R ...
- Oracle的汉字转拼音首字母的函数
CREATE OR REPLACE FUNCTION F_PINYIN(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS V_COMPARE VARCHAR2(100); ...
- 自定义不等高的cell-(storyboard)
对比自定义等高cell,需要几个额外的步骤(iOS8开始才支持) 添加子控件和contentView之间的间距约束 设置tableViewCell的真实行高和估算行高 // 告诉tableView所有 ...