日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
java位運(yùn)算的技巧有哪些

這篇“java位運(yùn)算的技巧有哪些”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“java位運(yùn)算的技巧有哪些”文章吧。

創(chuàng)新互聯(lián)主營(yíng)望奎網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶App定制開發(fā),望奎h5小程序定制開發(fā)搭建,望奎網(wǎng)站營(yíng)銷推廣歡迎望奎等地區(qū)企業(yè)咨詢

什么是位操作

我們都知道數(shù)據(jù)在計(jì)算機(jī)存儲(chǔ)的形式是二進(jìn)制數(shù)據(jù),位操作就是一種在二進(jìn)制層面操作數(shù)據(jù)的方法,位操作直接操作0,1構(gòu)成的二進(jìn)制數(shù)據(jù)。

基本的位操作

基本的位操作有六種,分別是 ** 與 或 非 異或 左移 右移 **

符號(hào)描述運(yùn)算規(guī)則
&兩個(gè)位都為1時(shí),結(jié)果才為1
兩個(gè)位都為0時(shí),結(jié)果才為0
^異或兩個(gè)位相同時(shí),結(jié)果為1,不相同為0
~取反0變1,1變0
<<左移各二進(jìn)位全部左移若干位,高位丟棄,低位補(bǔ)0
>>右移各二進(jìn)位全部左移若干位,高位丟棄,高位補(bǔ)符號(hào)位,或者補(bǔ)零,根據(jù)不同編譯器
  • ** 首先,必須明確位操作只能對(duì)整數(shù)進(jìn)行操作 **

  • 在jdk中,java右移是進(jìn)行算術(shù)右移操作

  • ** 位操作的優(yōu)先級(jí)很低,所以最好用括號(hào) **

java位運(yùn)算的技巧有哪些

上述代碼的輸出結(jié)果:

java位運(yùn)算的技巧有哪些

下面我們就分析一下為什么會(huì)輸出這個(gè)結(jié)果:

  • 首先對(duì)于13,我們寫出他的二進(jìn)制:0000 1101

  • 右移兩位: 0000 0011,由于jdk中的右移是算術(shù)右移,所以高位補(bǔ)00,結(jié)果為3

  • 對(duì)于-13,二進(jìn)制代碼: 1111 0011

  • 右移兩位,高位補(bǔ)符號(hào)位,1111 1100,結(jié)果是-4

位操作的常用技巧

位操作經(jīng)常用于一些小操作,由于他只能操作整形數(shù),所以用途有限,但是一些常用的小技巧是非常值得掌握的,判斷奇偶,交換兩數(shù),交換符號(hào),求絕對(duì)值等。下面我們就將一一介紹。

判斷奇偶

奇偶的區(qū)別體現(xiàn)在二進(jìn)制上,就是末尾是0,1 顯然當(dāng)末尾為0時(shí),是偶數(shù),當(dāng)末尾為1是最后一位奇數(shù)。所以判斷奇偶的方法是:

java位運(yùn)算的技巧有哪些

一個(gè)小的測(cè)試程序:

java位運(yùn)算的技巧有哪些

上面這個(gè)程序?qū)?huì)輸出所有1000以內(nèi)的偶數(shù)

交換兩數(shù)

利用位操作交換兩個(gè)數(shù)的好處是不用第三個(gè)temp變量(局限是只能交換整數(shù)變量)

java位運(yùn)算的技巧有哪些

分析一下交換是怎么產(chǎn)生的:
首先 a^=b 即a=(a^b);
b^=a 即b=b(ab),由于運(yùn)算滿足交換律,b(ab)=bb^a。一個(gè)數(shù)和自己異或肯定是0,因?yàn)樽约嚎隙ㄊ堑扔谧约旱睦玻敲匆粋€(gè)數(shù)和0異或的話,1和0異或還是1,0和0異或還是0,所以顯然一個(gè)數(shù)和0異或之后當(dāng)然還是自己本身。所以此時(shí),b被賦值為a。
最后一步,a^=b 就是a=ab,由于前面二步可知a=(ab),b=a,所以a=ab即a=(ab)^a。故a會(huì)被賦上b的值。

變換符號(hào)

變換符號(hào)顯然很簡(jiǎn)單,根據(jù)類似補(bǔ)碼,取反加一就可以了。

java位運(yùn)算的技巧有哪些

求絕對(duì)值

求絕對(duì)值就是在變換符號(hào)的基礎(chǔ)上實(shí)現(xiàn)的,我們只要先判斷是否為負(fù)數(shù),若是負(fù)數(shù),就變換符號(hào),不是,就直接返回。
判斷正負(fù)可以直接判斷其符號(hào)位,右移31位,取到符號(hào)位,判斷正負(fù)

java位運(yùn)算的技巧有哪些

對(duì)于任何數(shù),與0異或都會(huì)保持不變,與-1即0xFFFFFFFF異或就相當(dāng)于取反。因此,a與i異或后再減i(因?yàn)閕為0或-1,所以減i即是要么加0要么加1)也可以得到絕對(duì)值。所以可以對(duì)上面代碼優(yōu)化下:

java位運(yùn)算的技巧有哪些

位操作的應(yīng)用

常見的算法題,位操作實(shí)現(xiàn)A+B的操作是常見的算法題。

java位運(yùn)算的技巧有哪些

上述代碼就實(shí)現(xiàn)了不用+操作符,利用位操作實(shí)現(xiàn)兩個(gè)數(shù)的相加操作。
現(xiàn)在我們來講解位操作實(shí)現(xiàn)兩個(gè)數(shù)相加的原理
首先,十進(jìn)制中,我們知道,7+8,不進(jìn)位和是5,進(jìn)位是1,然后我們可以根據(jù)不進(jìn)位和和進(jìn)位5+1*10算出最后的結(jié)果15。
類似二進(jìn)制也可以采取這種方法
比如
a = 3,b = 6
a : 0011
b : 0110
不進(jìn)位和: 0101   也就是5
進(jìn)位:0010  也就是2
所以a+b變成5 + (2<<1)
5    0101
2<<1   0100
不進(jìn)位和 0001  = 1
進(jìn)位          0100  = 4
因此 a + b就變成了1 + 4 << 1
然后有
1    0001
4<<1   1000
不進(jìn)位和 1001  = 9
進(jìn)位          0000  = 0
當(dāng)時(shí)進(jìn)位為0時(shí),不進(jìn)位和為9即a + b之和。

可以發(fā)現(xiàn)上述是一個(gè)遞歸的過程,所以也就不難寫出代碼了。求兩個(gè)數(shù)的不進(jìn)位和實(shí)際上就是將兩個(gè)數(shù)異或操作即可。

以上就是關(guān)于“java位運(yùn)算的技巧有哪些”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站題目:java位運(yùn)算的技巧有哪些
本文鏈接:http://www.dlmjj.cn/article/gsphpe.html