首先得清楚一些基本数据类型的位数
接下来了解一下几个运算符
<<:有符号数左移运算符
<<<:无符号数左移运算符
>>:有符号数右移运算符
>>>:无符号数右移运算符
|:按位或运算
&:按位与运算
^:按位异或运算
~:按位取反运算
至于在运算符右边加=,无非是想改变被操作变量的值
由于打印数据时一般是按十进制打印的,所以要打印二进制数据的形式的话,要一位一位的去判断,然后再打印出来。
由于这些移位操作只是针对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,都是算成十进制后再转成高类型的,这样不会失去任何精确度。