位运算

>>> 无符号右移,第一位符号位不变,其余位用0补齐>> 右移,整体右移,右边的用0补齐<< 左移,整体左移,左边的用0补齐| 或:有1则1& 与:有0则0^ 异或:相同为1,否则为0~ 取反:

写个测试

1.5当前的jdk中,Integer等数字类型外部保护了一个成员变量叫 SIZE,以Integer为例:

/** * The number of bits used to represent an {@code int} value in two's * complement binary form. * * @since 1.5 */@Native public static final int SIZE = 32;

能够看出,Integer的长度是32位。上面是测试代码:

/** * 打印int数据的二进制 * * @param num int */private static void printBit(int num) {for (int i = 31; i >= 0; i--) {int i1 = num & (1 << i); // 1 左移 i 位,和num进行一个&与运算,如果后果是0,则打印0,否则打印1        System.out.print(i1 == 0 ? "0" : "1");    }System.out.println("");}

上面开始位运算:

public class BitOperationTest {    /**     * 打印int数据的二进制     *     * @param num int     */private static void printBit(int num) {for (int i = 31; i >= 0; i--) {int i1 = num & (1 << i); // 1 左移 i 位,和num进行一个&与运算,如果后果是0,则打印0,否则打印1            System.out.print(i1 == 0 ? "0" : "1");        }System.out.println("");    }public static void main(String[] args) {        int i = 10;        System.out.println("i : 10");        printBit(i);        int leftMove = i << 3;        System.out.println("leftMove : ");        printBit(leftMove);        int rightMove = i >> 3;        System.out.println("rightMove : ");        printBit(rightMove);        int unsignRightMove = i >>> 3;        System.out.println("unsignRightMove : ");        printBit(unsignRightMove);        System.out.println("===========");        System.out.println("i : 10");        printBit(i);        int j = -10;        System.out.println("j : -10");        printBit(j);        int or = i | j;        System.out.println(" i | j : ");        printBit(or);        int and = i & j;        System.out.println("i & j : ");        printBit(and);        int xor = i ^ j;        System.out.println(" i ^ j : ");        printBit(xor);        int neg = ~ i;        System.out.println(" ~ i : ");        printBit(neg);    }}

运行后果如下:

反码、补码

在上图能够看出,-10的二进制是 11111111111111111111111111110110,这里做个解释。

第一位是符号位,0示意负数,1示意正数。先对这个二进制数取反,失去 00000000000000000000000000001001,这就是反码 ,而后在反码的根底上+1,失去 补码00000000000000000000000000001010,这个数就是二进制的10,而后加上符号位,即-10。

Java各根底数据长度

看下Integer中的代码:

/** * The number of bits used to represent an {@code int} value in two's * complement binary form. * * @since 1.5 */@Native public static final int SIZE = 32;/** * The number of bytes used to represent a {@code int} value in two's * complement binary form. * * @since 1.8 */public static final int BYTES = SIZE / Byte.SIZE;

可知Integer的二进制长度为32位,有四个字节。

类型二进制长度字节数范畴
byte82-128~127
short164-32768~32767
int328-2^31 ~ 2^31-1
long6416-2^63~2^63-1
char1640~65535

代码地址