Java中位运算总结

一、预备知识:

一、概念讲解
   1.原码
        数字转为二进制的后表现形式(包括正数和负数)
   2.反码
        正数的反码和正数的原码相同;负数的反码,是最高位(符号位为1)不变,其他位取反
   3.补码
        正数的补码和正数的原码和反码相同。负数的补码是反码 + 1后运算的结果
二、正负数的表示
    1.正数在计算机中表示,就是二进制的原码
    2.负数在计算机中表示,就是二进制的补码


二、位运算讲解

注意:所有的位运算都是补码参与运算的。
1.&
与运算。规则是:二进制下,全为1,则为1,否则为0
2.|
或运算。规则是:二进制下,只要有一个1,就为1,否则就0
3.^
异或运算。规则是:二进制下,相同为0,不同为1
4.>> 
右移。
规则是:右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位右移对于无符号类型强制补0,对于有符号类型续补符号位
5.<< 
左移。
规则是:左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。
6.>>>
无符号位移。

无符号的移位只有右移,没有左移使用“>>>”进行移位,都补充0。

三、代码示例

public class BitOperation {

    /**
     * << 运算(左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。)
     * 0000 0000 0000 0000 0000 0000 0000 1000
     * 0000 0000 0000 0000 0000 0000 0010 0000   ---> 结果是:32
     */
    public static void test01() {
        int a = 45;
        int b = -45;
        System.out.println("十进制数据:" + a + " -> " + Integer.toBinaryString(a) + "    " + (a << 2) + " = " + a + " << 2");
        System.out.println("十进制数据:" + b + " -> " + Integer.toBinaryString(b) + "    " + (b << 2) + " = " + b + " << 2");
    }

    /**
     * >> 运算(右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位
     *         右移对于无符号类型强制补0,对于有符号类型续补符号位)
     * -8 >> 2的过程详解
     * -8的补码:    1111 1111 1111 1111 1111 1111 1111 1000
     * 右移2位:     1111 1111 1111 1111 1111 1111 1111 1110  (得到右移结果)
     * 转换为10进制: -1
     *               1111 1111 1111 1111 1111 1111 1111 1101
     *               取反
     *               1000 0000 0000 0000 0000 0000 0000 0010   -> 结果就是-2
     *
     */
    public static void test02() {
        int a = 8;
        int b = -8;
        System.out.println("十进制数据:" + a + " -> " + Integer.toBinaryString(a) + "    " + (a >> 2) + " = " + a + " >> 2");
        System.out.println("十进制数据:" + b + " -> " + Integer.toBinaryString(b) + "    " + (b >> 2) + " = " + b + " >> 2");
    }

    /**
     * >>> 无符号位移(无符号的移位只有右移,没有左移使用“>>>”进行移位,都补充0)
     * -7 >>>过程:
     *         1111 1111 1111 1111 1111 1111 1111 1001          -7 补码
     *         0001 1111 1111 1111 1111 1111 1111 1111           运算后的结果 十进制就是:536870911
     *
     */
    public static void test03() {
        int a = 7;
        int b = -7;
        System.out.println("十进制数据:" + a + " -> " + Integer.toBinaryString(a) + "    " + (a >>> 3) + " = " + a + " >>> 3");
        System.out.println("十进制数据:" + b + " -> " + Integer.toBinaryString(b) + "    " + (b >>> 3) + " = " + b + " >>> 3");
    }

    /**
     * &运算(二进制下,全为1,则为1,否则为0)
     * 8 & -7 过程:
     *             0000 0000 0000 0000 0000 0000 0000 1000    8
     *             1000 0000 0000 0000 0000 0000 0000 0111    -7 原码
     *             1111 1111 1111 1111 1111 1111 1111 1000    -7 反码
     *             1111 1111 1111 1111 1111 1111 1111 1001    -7 补码
     *
     *             & 后的结果为:
     *             0000 0000 0000 0000 0000 0000 0000 1000    ->8
     *
     *
     */
    public static void test04() {
        int a = 8;
        int b = 7;
        int c = -7;
        System.out.println(a + " & " + b + " = " + (a & b));
        System.out.println(a + " & " + c + " = " + (a & c));
    }

    /**
     * |运算(二进制下,只要有一个1,就为1,否则就0)
     *
     */
    public static void test05() {
        int a = 11;
        int b = 3;
        System.out.println(a + " | " + b + " = " + (a | b));
    }

    /**
     * ^运算(二进制下,相同为0,不同为1)
     *
     */
    public static void test06() {
        int a = 11;
        int b = 3;
        System.out.println(a + " ^ " + b + " = " + (a ^ b));
    }

    public static void main(String[] args) {
        test06();
    }
}

===========================================================================

不与别人比起点,只与别人比终点,把一切用来抱怨的时间去努力学习!与君共勉。

猜你喜欢

转载自blog.csdn.net/weixin_39723544/article/details/80326252