关于java操作中的移位运算
2013-08-23 17:40 飘雨汐 阅读(242) 评论(0) 收藏 举报首先得清楚一些基本数据类型的位数

接下来了解一下几个运算符
<<:有符号数左移运算符
<<<:无符号数左移运算符
>>:有符号数右移运算符
>>>:无符号数右移运算符
|:按位或运算
&:按位与运算
^:按位异或运算
~:按位取反运算
至于在运算符右边加=,无非是想改变被操作变量的值
由于打印数据时一般是按十进制打印的,所以要打印二进制数据的形式的话,要一位一位的去判断,然后再打印出来。
由于这些移位操作只是针对int和long这两个类型,对于char,byte,short皆是转成了int后才进行相应的移位操作,故这里打印二进制的话只打印int和long类型的,至于其它类型的,原理也是类似。
相关类如下:
package com.dgjianke.ch03; /** * 关于二进制数据的一些操作 * @author dgjianke * */ public class BitManipulation { /** * 打印出整型数据在机器中的二进制形式 * @param i 整型数据 */ public static void printIntBinary(int i) { for(int j=31;j>=0;j--) { if(((1 << j) & i)==0) { System.out.print(0); }else { System.out.print(1); } } System.out.println(); } /** * 打印出长整型数据在机器中的二进制形式 * @param i 长整形数据 */ public static void printLongBinary(long i) { for(int j=63;j>=0;j--) { if(((1L << j) & i)==0) { //注意这里为1L,否则不会按64位处理 System.out.print(0); }else { System.out.print(1); } } System.out.println(); } public static void printShortBinary(short i) { for(int j=15;j>=0;j--) { if(((1 << j) & i)==0) { System.out.print(0); }else { System.out.print(1); } } System.out.println(); } public static void main(String args[]) { int i = 1; int j = -1; //printIntBinary(i); //结果为:00000000000000000000000000000001 //printIntBinary(j); //结果为:11111111111111111111111111111111 long k = 3; long l = -3; printLongBinary(j);//long转int也是把低32位赋值给int类型 //printLongBinary(k); //结果为:0000000000000000000000000000000000000000000000000000000000000001 //printLongBinary(l); //结果为:1111111111111111111111111111111111111111111111111111111111111111 short s = -1; printShortBinary(s); //运算顺序:1. s转成int类型所以二进制为:11111111111111111111111111111111 //2. 再对这个int类型s进行移位运算结果:00000000001111111111111111111111 printIntBinary(s>>>10); //运算顺序:1. s转成int类型所以二进制为:11111111111111111111111111111111 //2. 再对这个int类型s进行移位运算结果:00000000001111111111111111111111 //3. 再将值赋值给s这个short类型,取低十六位进行赋值,结果为:1111111111111111(8个1),即十进制的-1 //4. 将值传给printIntBinary时,s再转成int类型,所以二进制为:11111111111111111111111111111111 printIntBinary(s>>>=10); //printIntBinary(~s); byte b = -1; //printIntBinary(b); System.out.println(b>>>10); //结果为:4194303 System.out.println(b>>>=10);//结果为:-1(原理和上面相同,只不过由低十六位换成了低八位) System.out.println(b>>>28);//结果为:15,这里实际打印int类型 System.out.println(b>>>=28);//结果为:15,这里实际打印byte类型,总之高位转低位是按低位来赋值 的 } }
PS:1.long 转 int的话需要强制转型,也是把低32位赋值给int类型变量
2.至于移位运算,不管是移位前还是移位后,返回结果为int型,当然这要排除移位赋值(如:>>>=)这种情况,这种情况返回类型皆为左边的类型。
3.低转高的情况:如:byte 转 short,都是算成十进制后再转成高类型的,这样不会失去任何精确度。
浙公网安备 33010602011771号