<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] > 1. Java移位運算符不外乎就這三種:<<(左移)、>>(帶符號右移)和>>>(無符號右移) > 2. java中的移位操作僅僅對int和long有效,byte、short、char升級為int后再進行移位 > 3. 計算機中存的都是補碼,整數的原碼、反碼、補碼都一樣,負數的 補碼是,符號位不變,取反(反碼)+1 ### 1. 左移運算符 > 左移運算符<<使指定值的所有位都左移規定的次數。 1)它的通用格式如下所示: ~~~ value << num ~~~ > num 指定要移位值value 移動的位數。 > 左移的規則只記住一點:丟棄最高位(符號位同樣丟棄),0補最低位 2)運算規則 > 1. 按二進制形式把所有的數字向左移動對應的位數,高位移出(舍棄),低位的空位補零。 > 2. 當左移的運算數是int 類型時,每移動1位它的第31位就要被移出并且丟棄; > 3. 當左移的運算數是long 類型時,每移動1位它的第63位就要被移出并且丟棄。 > 4. 當左移的運算數是byte 和short類型時,將自動把這些類型擴大為 int 型。 3)數學意義 > 在數字沒有溢出的前提下,對于正數和負數,左移一位都相當于乘以2的1次方,左移n位就相當于乘以2的n次方 4)計算過程: 例如:3 <<2(3為int型) > 1)把3轉換為二進制數字0000 0000 0000 0000 0000 0000 0000 0011, > 2)把該數字高位(左側)的兩個零移出,其他的數字都朝左平移2位 > 3)在低位(右側)的兩個空位補零。則得到的最終結果是0000 0000 0000 0000 0000 0000 0000 1100, > 轉換為十進制是12。 ### 2. 右移運算符 > 右移運算符<<使指定值的所有位都右移規定的次數。 1)它的通用格式如下所示: ~~~ value >> num ~~~ > num 指定要移位值value 移動的位數。 > 右移的規則只記住一點:符號位不變,左邊補上符號位 2)運算規則: > 1. 按二進制形式把所有的數字向右移動對應的位數,低位移出(舍棄),高位的空位補符號位,即正數補零,負數補1 > 2. 當右移的運算數是byte 和short類型時,將自動把這些類型擴大為 int 型。 > 3. 例如,如果要移走的值為負數,每一次右移都在左邊補1,如果要移走的值為正數,每一次右移都在左邊補0,這叫做符號位擴展(保留符號位)(sign extension ),在進行右移操作時用來保持負數的符號。 3)數學意義 > 右移一位相當于除2,右移n位相當于除以2的n次方。 4)計算過程 11 >>2(11為int型) > 1)11的二進制形式為:0000 0000 0000 0000 0000 0000 0000 1011 > 2)把低位的最后兩個數字移出,因為該數字是正數,所以在高位補零。 > 3)最終結果是0000 0000 0000 0000 0000 0000 0000 0010。 轉換為十進制是3。 35 >> 2(35為int型) 35轉換為二進制:0000 0000 0000 0000 0000 0000 0010 0011 把低位的最后兩個數字移出:0000 0000 0000 0000 0000 0000 0000 1000 轉換為十進制: 8 ### 3. 無符號右移 > 無符號右移運算符>>> 它的通用格式如下所示: ~~~ value >>> num ~~~ > 1. num 指定要移位值value 移動的位數。 > 2. 無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位 ### 4. 運算 #### 4.1 &(按位與) > * 兩位全位1,結果才為1; `0&0=0; 0&1=0 ; 1&1=1` 如:`51 &5 =0011 0011 & 0000 0101=0000 0001 = 1` 作用:清零、取一個數中指定位(即被與數0000) #### 4.2 | (按位或) > * 只要一個為1,結果就為1 #### 4.3 ^(異或) 相同為0,不相同為1 `0 ^ 0 =0 ; 0 ^1 = 1 ; 1 ^ 1=0;` #### 4.4 ~(按位取反) 按位取反, 0變成1 ,1變成 0; #### 5. int與byte轉換 ~~~ public static byte[] intToByte(int a){ byte bt[]=new byte[4]; bt[0]=(byte)((a>>0*8)&0xff); bt[1]=(byte)((a>>1*8)&0xff); bt[2]=(byte)((a>>2*8)&0xff); bt[3]=(byte)((a>>3*8)&0xff); return bt; } public static int byteToInt(byte[] a){ System.out.println((int)a[0]); //這里輸出的是-49 System.out.println((int)(a[0]&0xff));//這里輸出是207 int rs0=(int)((a[0]&0xff)<<0*8); int rs1=(int)((a[1]&0xff)<<1*8); int rs2=(int)((a[2]&0xff)<<2*8); int rs3=(int)((a[3]&0xff)<<3*8); int result=rs0+rs1+rs2+rs3; return result; } ~~~ &0xff 是16進制,二進制表示為11111111 * 因為對byte進行操作,所以或升級為int,負數高位全補1,所以會對結果產生錯誤影響,但是加了&0xff,高位變為0,成為正確結果 發現一個奇怪的現象, 直接輸出(int)a[0]結果是-49,而(int)(a[0]&0xff)理論上不變,但是輸出的結果卻是207; 原來,Java的int是4個字節32位的,在控制臺進行輸出的時候,jvm把11001111之前進行了補全,補為11111111 11111111 11111111 11001111,顯然這是-49的補碼,輸出結果是-49;而如果進行了a[0]&0xff ,補全后則變成00000000 00000000 00000000 11001111,此時結果變成了207,這時進行運算結果才是正確的。 java中,轉換時int輸出時 若byte符號位是0,如01001000,則進行int補0處理--》00000000 00000000 00000000 01001000; 若byte符號位是1,如11001000,則進行補1處理-->1111111 11111111 11111111 11001000 Ps: &0xff的作用就是把其他位置0,這八位不變; 一些實用的函數:Integer.toBinaryString(8100);可以輸出二進制碼; String s="abc"; byte[] bt = s.getBytes();可以得到字符串的二進制碼// s.getByte("utf-8")參數也可以指定編碼方式! for(byte b:bt){ System.out.println(Integer.toBinaryString(b));//輸出二進制碼 } 如果通過字節序列變成string,可以通過String s=new String(bt,"asci"); 形式 ## 5. 字節操作 ~~~ public static byte setBitValue(byte source, int pos, byte value) { byte mask = (byte) (1 << pos); if (value > 0) { source |= mask; } else { source &= (~mask); } return source; } ~~~ value>0 例如:設置第二位為1(source,2,1) (byte) (1 << pos); 00000001 -》00000100 | 與 00001000 得到 00001100 source &= (~mask); 00000100 -》01111011 & 00001000 其他為不變 00001000
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看