乐趣区

关于java:Java位运算

位运算

>>> 无符号右移,第一位符号位不变,其余位用 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 位,有四个字节。

类型 二进制长度 字节数 范畴
byte 8 2 -128~127
short 16 4 -32768~32767
int 32 8 -2^31 ~ 2^31-1
long 64 16 -2^63~2^63-1
char 16 4 0~65535

代码地址

退出移动版