java按位與、按位或、異或、移位、按位非


    /**
     * 測試按位與、按位或、異或、移位、按位非
     */
    @Test
    public void testYiWei() {
        int i = 3; //對應二進制 ...11
        int j = 2; //對應二進制 ...10
        int k = -3; //對應二進制 10000000 00000000 00000000 00000011(原碼)

        //按位與& 從高位開始兩個都為1 為1,否則 為0
        System.out.println(i & j); //10(2進制) -> 2(10進制)

        //按位或| 從高位開始只要1個為1 為1,否則 為0
        System.out.println(i | j); //11(2進制) -> 3(10進制)

        //異或^= 從高位開始相同為0,否則 為1
        System.out.println(i ^ j); //01(2進制) -> 1(10進制)

        //左移位<<1 向左移位1位,最低位補0,原來的第二高位現在成為最高位
        System.out.println(i << 1); //0011 移位后 0110,對應10進制的6

        //右移位>>1 向右移位1位,最高位補上符號位,且不變
        /*
            移位前 11111111 11111111 11111111 11111101(補碼)
            移位后 11111111 11111111 11111111 11111110(補碼),
            對應原碼 10000000 00000000 00000000 00000010
        */
        System.out.println(k >> 1); //-2(10進制)

        //無視符號右移位>>>1 向右移位1位,最高位補上0
        /*
            移位前 11111111 11111111 11111111 11111101(補碼)
            移位后 01111111 11111111 11111111 11111110(補碼),
            對應原碼 01111111 11111111 11111111 11111110
        */
        System.out.println(k >>> 1); //2147483646即2^31-1-1(10進制)

        /*
            按位非的流程:
            00000000 00000000 00000000 00000010  1.2的2進制(這里是補碼,因為是正數,所以和原碼一樣)
            11111111 11111111 11111111 11111101  2.位非
            11111111 11111111 11111111 11111100  3.取原碼  (-1)
            10000000 00000000 00000000 00000011  3.取原碼  (取反)
        */
        System.out.println(~j); //-3(10進制)
    }

這里需要知道原碼補碼反碼的一些知識,https://www.jianshu.com/p/129f9daae472(個人覺得這篇文章講得不錯)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM