久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

        手機站
        千鋒教育

        千鋒學習站 | 隨時隨地免費學

        千鋒教育

        掃一掃進入千鋒手機站

        領取全套視頻
        千鋒教育

        關注千鋒學習站小程序
        隨時隨地免費學習課程

        當前位置:首頁  >  技術干貨  > Java中位運算符

        Java中位運算符

        來源:千鋒教育
        發(fā)布人:qyf
        時間: 2022-06-07 15:46:00 1654587960

          日常開發(fā)中位運算不是很常用,但是巧妙的使用位運算可以大量減少運行開銷,優(yōu)化算法。舉個例子,翻轉操作比較常見,比如初始值為1,操作一次變?yōu)?,再操作一次變?yōu)?。可能的做法是使用三木運算符,判斷原始值為1還是0,如果是1,設置為0,否則設置為0.但是使用位運算,不用判斷原始值,直接改變值就可以:

          1^num//num為原始值

          當然,一條語句可能對代碼沒什么影響,但是在高重復,大數據量的情況下將會節(jié)省很多開銷。

          以下是自己整理的關于java位運算的部分內容,如有錯誤,還請指出,以共同進步,先行致謝。

          1. 位運算符

          java支持的位運算符:

          &:按位與。

          |:按位或。

          ~:按位非。

          ^:按位異或。

          <<:左位移運算符。

          >>:右位移運算符。

          <<<:無符號右移運算符。

          位運 算 符 中 ,除 ~ 以 外 ,其余 均 為 二元運算符,操作數只能為整型和字符型數據 。

          Java使用補碼來表示二進制數 ,在補碼表示中,最高 位 為符號位 ,正數的符號位為 0,負數 為 1。補碼的規(guī)定如下 :

          對 正 數 來 說 ,最高位為 0,其余 各 位 代 表 數 值 本 身 (以二 進制 表 示 ),如 +42的補碼 為 00101010。

          對負數而言,把該 數 絕 對 值 的 補 碼 按 位 取 反 ,然后 對 整 個數 加 1,即得 該 數的 補 碼 。 如 -1的補 碼 為11111111111111111111111111111111(00000000000000000000000000000001按 位 取 反 11111111111111111111111111111110+1=11111111111111111111111111111111 )。為何有那么多0、1,java中int是32位的。

          按位與(&)

          按位與的運算規(guī)則

        00

          規(guī)則總結:只有兩個操作數對應位同為1時,結果為1,其余全為0. (或者是只要有一個操作數為0,結果就為0)。舉例如下:

        01

        02

        03

          按位或(|)

          按位或的運算規(guī)則

        04

          規(guī)則總結:只有兩個操作數對應位同為0時,結果為0,其余全為1.(或者是只要有一個操作數為1,結果就為1)。

          按位非(~)

          按位非的運算規(guī)則

        05

          在求負數的源碼中使用過。

          按位異或(^)

          按位異或的運算規(guī)則

        06

          規(guī)則總結:異:1.

          左位移(<<)

          算術右移(>>): 符號位不變,低位補0。如:2<<2結果為8。

        07

          當移動的位數超過數字本身的位數時,那么不就都需要補0操作,實際上不是的,java不可能做那么浪費資源的事情。在真正執(zhí)行位移前,其對要移動的位數做了一些預處理,比如32處理為0,-1處理為31.

          右位移(>>)

          低位溢出,符號位不變,并用符號位補溢出的高位。如:-6>>2結果為-2。

        08

          無符號右移(>>>)

          低位溢出,高位補0。注意,無符號右移(>>>)中的符號位(最高位)也跟著變,無符號的意思是將符號位當作數字位看待。如:-1>>>1結果為2147483647。這個數字應該比較熟悉,看兩個輸出語句就知道是什么了:

          System.out.println(Integer.toBinaryString(-1>>>1));

          System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));

          輸出結果為:

          1111111111111111111111111111111

          1111111111111111111111111111111

          -1>>>1竟然得到了int所能表示的最大整數,精彩。

        09

          除了使用-1>>>1能得到Integer.MAX_VALUE,以下的也能得到同樣的結果:

                //maxInt

                System.out.println(~(1 << 31));

                System.out.println((1 << -1)-1);

                System.out.println(~(1 << -1));

          使用位運算往往能很巧妙的實現某些算法完成一些復雜的功能。

          常見使用

          1. m*2^n

          可以使用m<<n求得結果,如:< p="">

          System.out.println("2^3=" + (1<<3));//2^3=8

          System.out.println("3*2^3=" + (3<<3));//3*2^3=24

          計算結果是不是很正確呢?如果非要說2<<-1為什么不等于0.5,前面說過,位運算的操作數只能是整型和字符型。在求int所能表示的最小值時,可以使用

          //minInt

          System.out.println(1 << 31);

          System.out.println(1 << -1);

          可以發(fā)現左移31位和-1位所得的結果是一樣的,同理,左移30位和左移-2所得的結果也是一樣的。移動一個負數位,是不是等同于右移該負數的絕對值位呢?輸出一下就能發(fā)現不是的。java中int所能表示的最大數值是31位,加上符號位共32位。在這里可以有這樣的位移法則:

          法則一:任何數左移(右移)32的倍數位等于該數本身。

          法則二:在位移運算m<<n的計算中,若n為正數,則實際移動的位數為n%32,若n為負數,則實際移動的位數為(32+n%32),右移,同理。< p="">

          左移是乘以2的冪,對應著右移則是除以2的冪。

          2. 判斷一個數n的奇偶性

          n&1 == 1?”奇數”:”偶數”

          為什么與1能判斷奇偶?所謂的二進制就是滿2進1,那么好了,偶數的最低位肯定是0(恰好滿2,對不對?),同理,奇數的最低位肯定是1.int類型的1,前31位都是0,無論是1&0還是0&0結果都是0,那么有區(qū)別的就是1的最低位上的1了,若n的二進制最低位是1(奇數)與上1,結果為1,反則結果為0.

          3. 不用臨時變量交換兩個數

          在int[]數組首尾互換中,是不看到過這樣的代碼:

        public static int[] reverse(int[] nums){

        int i = 0;

        int j = nums.length-1;

        while(j>i){

        nums[i]= nums[i]^nums[j];

        nums[j] = nums[j]^nums[i];

        nums[i] = nums[i]^nums[j];

        j--;

        i++;

        }

        return nums;

        }

          連續(xù)三次使用異或,并沒有臨時變量就完成了兩個數字交換,怎么實現的呢?

        圖片4

          上面的計算主要遵循了一個計算公式:b^(a^b)=a。

          我們可以對以上公式做如下的推導:

          任何數異或本身結果為0.且有定理a^b=b^a。異或是一個無順序的運算符,則b^a^b=b^b^a,結果為0^a。

          再次列出異或的計算表:

        10

          可以發(fā)現,異或0具有保持的特點,而異或1具有翻轉的特點。使用這些特點可以進行取數的操作。那么0^a,使用異或0具有保持的特點,最終結果就是a。

          其實java中的異或運算法則完全遵守數學中的計算法則:

         ?、?a ^ a =0

         ?、?a ^ b =b ^ a

          ③ a ^b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;

         ?、?d = a ^b ^ c 可以推出 a = d ^ b ^ c.

          ⑤ a ^ b ^a = b.

          取絕對值

          (a^(a>>31))-(a>>31)

          先整理一下使用位運算取絕對值的思路:若a為正數,則不變,需要用異或0保持的特點;若a為負數,則其補碼為源碼翻轉每一位后+1,先求其源碼,補碼-1后再翻轉每一位,此時需要使用異或1具有翻轉的特點。

          任何正數右移31后只剩符號位0,最終結果為0,任何負數右移31后也只剩符號位1,溢出的31位截斷,空出的31位補符號位1,最終結果為-1.右移31操作可以取得任何整數的符號位。

          那么綜合上面的步驟,可得到公式。a>>31取得a的符號,若a為正數,a>>31等于0,a^0=a,不變;若a為負數,a>>31等于-1 ,a^-1翻轉每一位.

          更多關于“Java培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓經驗,課程大綱更科學更專業(yè),有針對零基礎的就業(yè)班,有針對想提升技術的好程序員班,高品質課程助理你實現java程序員夢想。

        tags:
        聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
        10年以上業(yè)內強師集結,手把手帶你蛻變精英
        請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
        免費領取
        今日已有369人領取成功
        劉同學 138****2860 剛剛成功領取
        王同學 131****2015 剛剛成功領取
        張同學 133****4652 剛剛成功領取
        李同學 135****8607 剛剛成功領取
        楊同學 132****5667 剛剛成功領取
        岳同學 134****6652 剛剛成功領取
        梁同學 157****2950 剛剛成功領取
        劉同學 189****1015 剛剛成功領取
        張同學 155****4678 剛剛成功領取
        鄒同學 139****2907 剛剛成功領取
        董同學 138****2867 剛剛成功領取
        周同學 136****3602 剛剛成功領取
        相關推薦HOT
        石屏县| 太原市| 林芝县| 富源县| 株洲市| 怀宁县| 措勤县| 滦平县| 梅河口市| 龙江县| 宜都市| 郸城县| 深泽县| 肃南| 江阴市| 伊春市| 崇信县| 长沙县| 江达县| 鄂托克旗| 七台河市| 定西市| 综艺| 安泽县| 沂源县| 无棣县| 南昌县| 苏尼特左旗| 尤溪县| 安溪县| 平邑县| 澄江县| 济宁市| 随州市| 海门市| 封丘县| 新兴县| 汶川县| 定安县| 郎溪县| 射阳县|