天天看點

位運算和浮點數的簡單思考位運算和浮點數的簡單思考

位運算和浮點數的簡單思考

/**
     * 負數的位運算,先求補碼進行位運算,計算完畢後若 符号位高位仍為負數,就再求補碼
     *
     * 浮點數的表示是  (-1)^s * M * 2^E
     * 32位的浮點數,最高位是符号位S,接着11位是指數E,剩下的8位為M
     * 64位的浮點數,最高位是符号位S,接着11位是指數E,剩下的52位位M
     * 精度不一緻,這也就導緻了float轉換成double類型後結果可能會不一樣的情況
     *
     * 例如  10.5  二進制為 1010.1   相當于 1.0101*2^3 (左移三位) 則 符号位s為0,M為1.0101,E為3
     */
    public static void main(String[] args) throws Exception{

        // 左移(<<) 低位補0  相當于做乘法
        System.out.println( << );// 運作結果是60
        System.out.println(- << ); //運作結果是-60
        // 右移(>>) 高位補符号位
        System.out.println( >> );// 運作結果是2
        System.out.println(- >> );//運作結果是-2
        // 3、無符号右移( >>> ) 高位補0
        System.out.println( >> );// 結果是1
        System.out.println(- >> );// 結果是-2
        System.out.println(- >>> );// 結果是536870910

        float a = f;     //對于單精度 二進制表示 尾數隻能表示23位的精度
        double b = (double)a;   //對于雙精度 二進制表示 尾數表示的位數更多
        System.out.println("b= "+b); //6.400000095367432
    }
           

繼續閱讀