首先得清楚一些基本数据类型的位数

java 按位与 amp java按位左移_java

 

接下来了解一下几个运算符

<<:有符号数左移运算符

<<<:无符号数左移运算符

>>:有符号数右移运算符

>>>:无符号数右移运算符

|:按位或运算

&:按位与运算

^:按位异或运算

~:按位取反运算

至于在运算符右边加=,无非是想改变被操作变量的值

 

由于打印数据时一般是按十进制打印的,所以要打印二进制数据的形式的话,要一位一位的去判断,然后再打印出来。

由于这些移位操作只是针对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,都是算成十进制后再转成高类型的,这样不会失去任何精确度。