91aaa在线国内观看,亚洲AV午夜福利精品一区二区,久久偷拍人视频,久久播这里有免费视播

<strong id="fvuar"></strong>

  • <sub id="fvuar"><dl id="fvuar"><em id="fvuar"></em></dl></sub>

    1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

      手機(jī)站
      千鋒教育

      千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

      千鋒教育

      掃一掃進(jìn)入千鋒手機(jī)站

      領(lǐng)取全套視頻
      千鋒教育

      關(guān)注千鋒學(xué)習(xí)站小程序
      隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

      當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > Java中位運(yùn)算符

      Java中位運(yùn)算符

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

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

        1^num//num為原始值

        當(dāng)然,一條語(yǔ)句可能對(duì)代碼沒(méi)什么影響,但是在高重復(fù),大數(shù)據(jù)量的情況下將會(huì)節(jié)省很多開(kāi)銷(xiāo)。

        以下是自己整理的關(guān)于java位運(yùn)算的部分內(nèi)容,如有錯(cuò)誤,還請(qǐng)指出,以共同進(jìn)步,先行致謝。

        1. 位運(yùn)算符

        java支持的位運(yùn)算符:

        &:按位與。

        |:按位或。

        ~:按位非。

        ^:按位異或。

        <<:左位移運(yùn)算符。

        >>:右位移運(yùn)算符。

        <<<:無(wú)符號(hào)右移運(yùn)算符。

        位運(yùn) 算 符 中 ,除 ~ 以 外 ,其余 均 為 二元運(yùn)算符,操作數(shù)只能為整型和字符型數(shù)據(jù) 。

        Java使用補(bǔ)碼來(lái)表示二進(jìn)制數(shù) ,在補(bǔ)碼表示中,最高 位 為符號(hào)位 ,正數(shù)的符號(hào)位為 0,負(fù)數(shù) 為 1。補(bǔ)碼的規(guī)定如下 :

        對(duì) 正 數(shù) 來(lái) 說(shuō) ,最高位為 0,其余 各 位 代 表 數(shù) 值 本 身 (以二 進(jìn)制 表 示 ),如 +42的補(bǔ)碼 為 00101010。

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

        按位與(&)

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

      00

        規(guī)則總結(jié):只有兩個(gè)操作數(shù)對(duì)應(yīng)位同為1時(shí),結(jié)果為1,其余全為0. (或者是只要有一個(gè)操作數(shù)為0,結(jié)果就為0)。舉例如下:

      01

      02

      03

        按位或(|)

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

      04

        規(guī)則總結(jié):只有兩個(gè)操作數(shù)對(duì)應(yīng)位同為0時(shí),結(jié)果為0,其余全為1.(或者是只要有一個(gè)操作數(shù)為1,結(jié)果就為1)。

        按位非(~)

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

      05

        在求負(fù)數(shù)的源碼中使用過(guò)。

        按位異或(^)

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

      06

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

        左位移(<<)

        算術(shù)右移(>>): 符號(hào)位不變,低位補(bǔ)0。如:2<<2結(jié)果為8。

      07

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

        右位移(>>)

        低位溢出,符號(hào)位不變,并用符號(hào)位補(bǔ)溢出的高位。如:-6>>2結(jié)果為-2。

      08

        無(wú)符號(hào)右移(>>>)

        低位溢出,高位補(bǔ)0。注意,無(wú)符號(hào)右移(>>>)中的符號(hào)位(最高位)也跟著變,無(wú)符號(hào)的意思是將符號(hào)位當(dāng)作數(shù)字位看待。如:-1>>>1結(jié)果為2147483647。這個(gè)數(shù)字應(yīng)該比較熟悉,看兩個(gè)輸出語(yǔ)句就知道是什么了:

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

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

        輸出結(jié)果為:

        1111111111111111111111111111111

        1111111111111111111111111111111

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

      09

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

              //maxInt

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

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

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

        使用位運(yùn)算往往能很巧妙的實(shí)現(xiàn)某些算法完成一些復(fù)雜的功能。

        常見(jiàn)使用

        1. m*2^n

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

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

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

        計(jì)算結(jié)果是不是很正確呢?如果非要說(shuō)2<<-1為什么不等于0.5,前面說(shuō)過(guò),位運(yùn)算的操作數(shù)只能是整型和字符型。在求int所能表示的最小值時(shí),可以使用

        //minInt

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

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

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

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

        法則二:在位移運(yùn)算m<<n的計(jì)算中,若n為正數(shù),則實(shí)際移動(dòng)的位數(shù)為n%32,若n為負(fù)數(shù),則實(shí)際移動(dòng)的位數(shù)為(32+n%32),右移,同理。< p="">

        左移是乘以2的冪,對(duì)應(yīng)著右移則是除以2的冪。

        2. 判斷一個(gè)數(shù)n的奇偶性

        n&1 == 1?”奇數(shù)”:”偶數(shù)”

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

        3. 不用臨時(shí)變量交換兩個(gè)數(shù)

        在int[]數(shù)組首尾互換中,是不看到過(guò)這樣的代碼:

      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ù)三次使用異或,并沒(méi)有臨時(shí)變量就完成了兩個(gè)數(shù)字交換,怎么實(shí)現(xiàn)的呢?

      圖片4

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

        我們可以對(duì)以上公式做如下的推導(dǎo):

        任何數(shù)異或本身結(jié)果為0.且有定理a^b=b^a。異或是一個(gè)無(wú)順序的運(yùn)算符,則b^a^b=b^b^a,結(jié)果為0^a。

        再次列出異或的計(jì)算表:

      10

        可以發(fā)現(xiàn),異或0具有保持的特點(diǎn),而異或1具有翻轉(zhuǎn)的特點(diǎn)。使用這些特點(diǎn)可以進(jìn)行取數(shù)的操作。那么0^a,使用異或0具有保持的特點(diǎn),最終結(jié)果就是a。

        其實(shí)java中的異或運(yùn)算法則完全遵守?cái)?shù)學(xué)中的計(jì)算法則:

       ?、?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.

        取絕對(duì)值

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

        先整理一下使用位運(yùn)算取絕對(duì)值的思路:若a為正數(shù),則不變,需要用異或0保持的特點(diǎn);若a為負(fù)數(shù),則其補(bǔ)碼為源碼翻轉(zhuǎn)每一位后+1,先求其源碼,補(bǔ)碼-1后再翻轉(zhuǎn)每一位,此時(shí)需要使用異或1具有翻轉(zhuǎn)的特點(diǎn)。

        任何正數(shù)右移31后只剩符號(hào)位0,最終結(jié)果為0,任何負(fù)數(shù)右移31后也只剩符號(hào)位1,溢出的31位截?cái)?,空出?1位補(bǔ)符號(hào)位1,最終結(jié)果為-1.右移31操作可以取得任何整數(shù)的符號(hào)位。

        那么綜合上面的步驟,可得到公式。a>>31取得a的符號(hào),若a為正數(shù),a>>31等于0,a^0=a,不變;若a為負(fù)數(shù),a>>31等于-1 ,a^-1翻轉(zhuǎn)每一位.

        更多關(guān)于“Java培訓(xùn)”的問(wèn)題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓(xùn)經(jīng)驗(yàn),課程大綱更科學(xué)更專(zhuān)業(yè),有針對(duì)零基礎(chǔ)的就業(yè)班,有針對(duì)想提升技術(shù)的好程序員班,高品質(zhì)課程助理你實(shí)現(xiàn)java程序員夢(mèng)想。

      tags:
      聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
      10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
      請(qǐng)您保持通訊暢通,專(zhuān)屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
      免費(fèi)領(lǐng)取
      今日已有369人領(lǐng)取成功
      劉同學(xué) 138****2860 剛剛成功領(lǐng)取
      王同學(xué) 131****2015 剛剛成功領(lǐng)取
      張同學(xué) 133****4652 剛剛成功領(lǐng)取
      李同學(xué) 135****8607 剛剛成功領(lǐng)取
      楊同學(xué) 132****5667 剛剛成功領(lǐng)取
      岳同學(xué) 134****6652 剛剛成功領(lǐng)取
      梁同學(xué) 157****2950 剛剛成功領(lǐng)取
      劉同學(xué) 189****1015 剛剛成功領(lǐng)取
      張同學(xué) 155****4678 剛剛成功領(lǐng)取
      鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
      董同學(xué) 138****2867 剛剛成功領(lǐng)取
      周同學(xué) 136****3602 剛剛成功領(lǐng)取
      相關(guān)推薦HOT
      抖音小店怎么做代銷(xiāo)

      抖音已經(jīng)成為了一個(gè)非常受歡迎的短視頻應(yīng)用程序,在其中許多用戶都精心打造了自己的小店,用于銷(xiāo)售各種各樣的商品,獲取額外的收入。然而,要想...詳情>>

      2023-10-08 15:28:41
      怎樣開(kāi)抖音小店帶貨賺錢(qián)

      隨著直播帶貨的火熱,越來(lái)越多的人開(kāi)始嘗試通過(guò)抖音小店來(lái)開(kāi)展帶貨業(yè)務(wù)。抖音小店是抖音直播帶貨的配套,可以讓用戶在購(gòu)買(mǎi)直播中產(chǎn)品時(shí)就實(shí)現(xiàn)購(gòu)...詳情>>

      2023-10-08 15:06:36
      能不能幫我打開(kāi)抖音小店店鋪呢怎么弄

      抖音小店是近年來(lái)非?;鸨囊粋€(gè)網(wǎng)絡(luò)業(yè)務(wù),也是提供了很多商業(yè)機(jī)會(huì)的平臺(tái)。對(duì)于一個(gè)創(chuàng)業(yè)者而言,開(kāi)設(shè)抖音小店是一個(gè)不錯(cuò)的選擇。但是,許多小店...詳情>>

      2023-10-08 15:01:21
      藍(lán)v抖音小店怎么開(kāi)通店鋪

      藍(lán)v抖音小店是一個(gè)非常熱門(mén)的電商平臺(tái),它可以讓賣(mài)家在抖音上開(kāi)設(shè)自己的店鋪,從而出售自己的商品。隨著抖音的不斷發(fā)展壯大,越來(lái)越多的賣(mài)家希...詳情>>

      2023-10-08 14:51:53
      抖音小店怎么更改類(lèi)目名稱(chēng)

      抖音小店是現(xiàn)在非常火熱的一種網(wǎng)店形態(tài),許多小生意也從中獲得了收益。但是隨著經(jīng)營(yíng)時(shí)間的增長(zhǎng),小店也需要對(duì)自己的類(lèi)目名稱(chēng)進(jìn)行更改,因?yàn)檫@可...詳情>>

      2023-10-08 14:46:50
      快速通道