Java位移計算的簡單瞭解

假設有一個 int 類型的數,值爲5,那麼,咱們知道它在計算機中表示爲:html

00000000 00000000 00000000 00000101java

5轉換成二制是101,不過int類型的數佔用4字節(32位),因此前面填了一堆0。bash

如今想知道,-5在計算機中如何表示?ide

 

在計算機中,負數以其正值的補碼形式表達測試

什麼叫補碼呢?這得從原碼,反碼提及。spa

 

原碼:一個整數,按照絕對值大小轉換成的二進制數,稱爲原碼。.net

好比 00000000 00000000 00000000 00000101 是 5的 原碼。code

 

反碼:將二進制數按位取反,所得的新二進制數稱爲原二進制數的反碼。orm

取反操做指:原爲1,得0;原爲0,得1。(1變0; 0變1)htm

好比:將00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。

稱:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反碼。

反碼是相互的,因此也可稱:

11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互爲反碼。

 

補碼:反碼加1稱爲補碼。

也就是說,要獲得一個數的補碼,先獲得反碼,而後將反碼加上1,所得數稱爲補碼。

好比:00000000 00000000 00000000 00000101 的反碼是:11111111 11111111 11111111 11111010。

那麼,補碼爲:

11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011


因此,-5 在計算機中表達爲:11111111 11111111 11111111 11111011。轉換爲十六進制:0xFFFFFFFB。


再舉一例,咱們來看整數-1在計算機中如何表示。

假設這也是一個int類型,那麼:


一、先取1的原碼:00000000 00000000 00000000 00000001

二、得反碼:     11111111 11111111 11111111 11111110

三、得補碼:     11111111 11111111 11111111 11111111


可見,-1在計算機裏用二進制表達就是全1。16進製爲:0xFFFFFF

package com.sohu.hot.vis.servlet;

/**
 * 位移測試一下
 *
 * @author liweihan
 * @time 2017-05-05 10:33
 */
public class Test {

/**
     java中有三種移位運算符

     <<      :     左移運算符,num << 1,至關於num乘以2

     >>      :     右移運算符,num >> 1,至關於num除以2

     >>>    :     無符號右移,忽略符號位,空位都以0補齊
 */

    public static void main(String[] args) {
        int number = 10;
        printNowNum(number);
        toLeft(number,1);
        toRight(number,1);


        int number2 = -10;
        printNowNum(number2);
        toLeft(number2,1);
        toRight(number2,1);


        int number3 = 3;
        printNowNum(number3);
        toLeft(number3,1);
        toRight(number3,1);

        int number4 = -3;
        printNowNum(number4);
        toLeft(number4,1);
        toRight(number4,1);
    }

    /**
     * @author liweihan
     * @time 2017/5/5 11:05
     * @description     打印當前的數字
     * @param number
     */
    private static void printNowNum(int number) {
        System.out.println("=============================");
        //原始二進制
        printInfo(number);
        System.out.println("Now Number: " + number);
    }

    /**
     * @author liweihan
     * @time 2017/5/5 10:48
     * @description 左移offset位
     * @param number    原始數值
     * @param offset  左移位數
     */
    private static void toLeft(int number, int offset) {
        //左移一位
        number = number << offset;
        printInfo(number);
        System.out.println("Now Number: " + number);
    }

    /**
     * @author liweihan
     * @time 2017/5/5 10:50
     * @description  右移offset位
     * @param number  原始數值
     * @param offset   右移位數
     */
    private static void toRight(int number,int offset) {
        //右移一位
        number = number >> offset;
        printInfo(number);
        System.out.println("Now Number: " + number);
    }

    /**
     * @author liweihan
     * @time 2017/5/5 10:34
     * @description 打印一個int的二進制數
     * @param num   十進制數字
     */
    private static void printInfo(int num) {
        System.out.println(Integer.toBinaryString(num));
    }

    /**
     * @author liweihan
     * @time 2017/5/5 10:42
     * @description     二進制轉爲十進制
     * @param binaryString  二進制字符
     */
    private static void printInfo(String binaryString) {
        System.out.println(Integer.parseInt(binaryString,2));
    }
}

結果:

=============================
1010
Now Number: 10
10100
Now Number: 20
101
Now Number: 5

=============================
11111111111111111111111111110110
Now Number: -10
11111111111111111111111111101100
Now Number: -20
11111111111111111111111111111011
Now Number: -5

=============================
11
Now Number: 3
110
Now Number: 6
1
Now Number: 1

=============================
11111111111111111111111111111101
Now Number: -3
11111111111111111111111111111010
Now Number: -6
11111111111111111111111111111110
Now Number: -2

Process finished with exit code 0

下面的兩篇文章能夠參考:

http://www.cnblogs.com/huangjianwu/p/4549085.html

http://blog.csdn.net/xiaochunyong/article/details/7748713

相關文章
相關標籤/搜索