java程式猿如何練習java版的易筋經?

  • 2019 年 10 月 7 日
  • 筆記

故事背景

  電視劇《天龍八部》中,阿朱易容後進入少林寺偷走了《易筋經》,她一直想把這本書送給喬峰。耿直的喬峰覺得此書來歷不正,不肯接受。幾番波折,這本書最後落到聚賢庄莊主游坦之手裡。怪人游坦之靠著《易筋經》練就神功,後來甚至能和喬峰抗衡.

java程式猿如何練習java版的易筋經?

 

  《易筋經》的功夫圜一身之脈絡,系五臟之精神,周而不散,行而不斷,氣自內生,血從外潤。練成此經後,心動而力發,一攢一放,自然而施,不覺其出而自出,如潮之漲,似雷之發。練那《易筋經》,便如一葉小舟於大海巨濤之中,怒浪澎湃之際,小舟自然拋高伏低,何嘗用力?若要用力,又哪有力道可用?又從何處用起?

java版的易筋經<The Java® Language Specification>

  《易筋經》練法古拙樸實,修聚而得的內力也是無可撼動,根基之穩,於「三大神功」中稱得第一。修習java,內功首推jsl,招式也要練起,不然內功無法表現出來。我們舉例來說,在電腦系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。

其中的術語如下:

原碼:將一個整數,轉換成二進位,就是其原碼。如單位元組的5的原碼為:0000 0101;-5的原碼為1000 0101。

反碼:正數的反碼就是其原碼;負數的反碼是將原碼中,除符號位以外,每一位取反。如單位元組的5的反碼為:0000 0101;-5的反碼為1111 1010。

補碼:正數的補碼就是其原碼;負數的反碼+1就是補碼。如單位元組的5的補碼00000101;-5的補碼1111 1011。

總結一句話,正數的原碼=反碼=補碼,負數的原碼!=反碼,反碼+1=補碼

我們來 看看JSL3中關於int的描述

All decimal literals from 0 to 2147483647 may appear anywhere an int literal may appear. The decimal literal 2147483648 may appear only as the operand of the unary minus operator - (§15.15.4).  It is a compile-time error if the decimal literal 2147483648 appears anywhere other than as the operand of the unary minus operator; or if a decimal literal of type int is larger than 2147483648 (231).  The largest positive hexadecimal, octal, and binary literals of type int - each of which represents the decimal value 2147483647 (2^31-1) - are respectively:  0x7fff_ffff,  0177_7777_7777, and  0b0111_1111_1111_1111_1111_1111_1111_1111  The most negative hexadecimal, octal, and binary literals of type int - each of which represents the decimal value -2147483648 (-2^31) - are respectively:  0x8000_0000,  0200_0000_0000, and  0b1000_0000_0000_0000_0000_0000_0000_0000  The following hexadecimal, octal, and binary literals represent the decimal value -1:  0xffff_ffff,  0377_7777_7777, and  0b1111_1111_1111_1111_1111_1111_1111_1111  It is a compile-time error if a hexadecimal, octal, or binary int literal does not fit in 32 bits.

注意,為了便於觀察,java支援使用”_”分割2進位,8進位,16進位,還有10進位數,下面的程式編譯不會報錯哦

    public static void main(String[] args) {          int i=0b1000_0000_0000_0000_0000_0000_0000_0000;          int j=0200_0000_0000;          int k=0x8000_0000;          int m=500_000;      }

回到原碼,反碼,補碼來上來看:

-1的原碼:0b1000_0000_0000_0000_0000_0000_0000_0001    -1的反碼:0b1111_1111_1111_1111_1111_1111_1111_1110    -1的補碼:0b1111_1111_1111_1111_1111_1111_1111_1111

我們來驗證一下-1在電腦中是否以補碼錶示:

    public static void main(String[] args) {          System.out.println(Integer.toBinaryString(-1));      }

結果為:

11111111111111111111111111111111

同樣,我們還可以驗證各種類型的值,如下面程式所示:

    public static void main(String[] args) {          System.out.println(Integer.toBinaryString((Byte.MAX_VALUE & 0xFF) + 0x100).substring(1));          System.out.println(Integer.toBinaryString((Byte.MIN_VALUE & 0xFF) + 0x100).substring(1));          System.out.println(Integer.toBinaryString(((byte)5 & 0xFF) + 0x100).substring(1));          System.out.println(Integer.toBinaryString(((byte)-5 & 0xFF) + 0x100).substring(1));          System.out.println(Integer.toBinaryString((Character.MAX_VALUE&0xFFFF)+0x10000).substring(1));          System.out.println(Integer.toBinaryString((Character.MIN_VALUE&0xFFFF)+0x10000).substring(1));          System.out.println(Integer.toBinaryString(((char)5&0xFFFF)+0x10000).substring(1));          System.out.println(Integer.toBinaryString(((char)-5&0xFFFF)+0x10000).substring(1));            System.out.println(Integer.toBinaryString((Short.MAX_VALUE&0xFFFF)+0x10000).substring(1));          System.out.println(Integer.toBinaryString((Short.MIN_VALUE&0xFFFF)+0x10000).substring(1));          System.out.println(Integer.toBinaryString(((short)5&0xFFFF)+0x10000).substring(1));          System.out.println(Integer.toBinaryString(((short)-5&0xFFFF)+0x10000).substring(1));            System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));          System.out.println(Integer.toBinaryString(Integer.MIN_VALUE));          System.out.println(Integer.toBinaryString(5));          System.out.println(Integer.toBinaryString(-5));      }

輸出結果:

01111111

10000000

00000101

11111011

1111111111111111

0000000000000000

0000000000000101

1111111111111011

0111111111111111

1000000000000000

0000000000000101

1111111111111011

1111111111111111111111111111111

10000000000000000000000000000000

101

11111111111111111111111111111011

也滿足補碼的規則。

參考資料

【1】https://baike.baidu.com/item/%E6%98%93%E7%AD%8B%E7%BB%8F/20234647?fr=aladdin

【2】https://docs.oracle.com/javase/specs/jls/se12/html/jls-3.html#jls-HexNumeral