位运算,Java

 2016-05-07 17:24:24     位运算  算法   971


导读: 最近在看数组排序算法时,涉及到位运算,发现以前学的基础知识都忘了,于是简单温故知新了一下。

在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。

废话不说,直接上代码。

Java代码

/**
 * 字节位运算
 */
public class Test1 {

    public static void main(String[] args) {
        int a = 5, b = 1;
        leftMove(a, b);
        rightMove(a, b);
        rightMoveWithoutSymbol(a, b);
        xor(a, b);
        and(a, b);
        or(a, b);
        not(a);
    }

    /**
     * 左移运算
     * 二进制左移b位,低位补0。相当于a乘以2的b次方,负数除外
     * 二进制的首位数字标识正负,0:正,1:负
     * 0000 0000 0000 0000 0000 0000 0000 0101 << 2 = 0000 0000 0000 0000 0000 0000 0001 0100
     * @param a
     * @param b
     */
    public static void leftMove(int a, int b) {
        System.out.printf("%d << %d = %d", a, b, a << b);
        System.out.println();
    }

    /**
     * 右移运算
     * 二进制右移b位,高位补0。相当于a除以2的b次方,负数除外
     * 二进制的首位数字标识正负,0:正,1:负
     * 0000 0000 0000 0000 0000 0000 0000 0101 >> 2 = 0000 0000 0000 0000 0000 0000 0000 0001
     * @param a
     * @param b
     */
    public static void rightMove(int a, int b) {
        System.out.printf("%d >> %d = %d", a, b, a >> b);
        System.out.println();
    }

    /**
     * 无符号右移
     * 先进行右移计算,得到的结果首位数字不再标识正负,代表真实的数字
     * @param a
     * @param b
     */
    public static void rightMoveWithoutSymbol(int a, int b) {
        System.out.printf("%d >>> %d = %d", a, b, a >>> b);
        System.out.println();
    }

    /**
     * 位异或计算
     * 二进制数进行位异或计算时,1 ^ 1 = 0, 0 ^ 1 = 1, 0 ^ 0 = 0
     * @param a
     * @param b
     */
    public static void xor(int a, int b) {
        System.out.printf("%d ^ %d = %d", a, b, a ^ b);
        System.out.println();
    }

    /**
     * 位与计算
     * 二进制数进行位与计算时,1 & 1 = 1, 0 & 1 = 0, 0 & 0 = 0
     * 0000 0000 0000 0000 0000 0000 0000 0101
     *                                       &
     * 0000 0000 0000 0000 0000 0000 0000 0011
     *                                       =
     * 0000 0000 0000 0000 0000 0000 0000 0001
     *
     * @param a
     * @param b
     */
    public static void and(int a, int b) {
        System.out.printf("%d & %d = %d", a, b, a & b);
        System.out.println();
    }

    /**
     * 位或计算
     * 二进制数进行位或计算时,1 | 1 = 1, 0 | 1 = 0, 0 | 0 = 0
     * @param a
     * @param b
     */
    public static void or(int a, int b) {
        System.out.printf("%d | %d = %d", a, b, a | b);
        System.out.println();
    }

    /**
     * 位非计算
     * 二进制数进行位非计算时,~1 = 0, ~0 = 1
     * 首位数字标识正负,0:正,1:负
     * @param a
     */
    public static void not(int a) {
        System.out.printf("~%d = %d", a, ~a);
        System.out.println();
    }
}