欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java二進(jìn)制操作(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

 更新時(shí)間:2017年03月31日 09:32:17   投稿:mrr  
這篇文章給大家介紹了java二進(jìn)制操作技巧,包括移位、位運(yùn)算操作符等相關(guān)知識(shí)點(diǎn),非常不錯(cuò),感興趣的朋友參考下吧

移位

位運(yùn)算中大多數(shù)操作都是向左移位和向右移位。在Java中,這對(duì)應(yīng)著<<和>>這兩個(gè)操作符,示例如下:

/* 00000001 << 1 = 00000010 */
1 << 1 == 2 
/* 00000001 << 3 = 00001000 */
1 << 3 == 8
/* 11111111 11111111 11111111 11110000 >> 4 = 11111111 11111111 11111111 11111111 */
0xFFFFFFF0 >> 4 == 0xFFFFFFFF 
/* 00001111 11111111 11111111 11111111 >> 4 = 00000000 11111111 11111111 11111111 */
0x0FFFFFFF >> 4 == 0x00FFFFFF

注意:向右移位是有符號(hào)操作符。和許多語(yǔ)言一樣,Java使用最高位來(lái)表示數(shù)值的正負(fù),負(fù)數(shù)的最高位永遠(yuǎn)為1。一個(gè)以1開(kāi)頭的二進(jìn)制數(shù)移位后還將以1開(kāi)頭,一個(gè)以0開(kāi)頭的二進(jìn)制樹(shù)移位后還將以0開(kāi)頭。所以要小心:Java是可以在整數(shù)中進(jìn)行位運(yùn)算的。

你可以使用叫作“無(wú)符號(hào)右移”運(yùn)算符的第三個(gè)操作符:>>> 來(lái)實(shí)現(xiàn)以“0”填充的移位,這種移位會(huì)忽略符號(hào)位并總是用“0”來(lái)填充。

/* 10000000 00000000 00000000 00000000 >>> 1 = 01000000 00000000 00000000 00000000 */
0x80000000 >>> 1 == 0x40000000
/* 10000000 00000000 00000000 00000000 >> 1 = 11000000 00000000 00000000 00000000 */
0x80000000 >> 1 == 0xC0000000

最大的用途之一是迅速求2的冪。1向左移位1位是2,移2位是4,移3位是8…… 相似的,向右移1位相當(dāng)于是把該數(shù)除以2。

另一個(gè)用途便是創(chuàng)建掩碼。位掩碼可用于屏蔽或者修改一個(gè)二進(jìn)制數(shù)中的某些指定位,下一部分會(huì)進(jìn)行詳細(xì)講解。假如我們想要?jiǎng)?chuàng)建一個(gè)

00001000的掩碼,代碼十分簡(jiǎn)單:

int bitmask = 1 << 3;

你可以使用位運(yùn)算操作符來(lái)創(chuàng)建更復(fù)雜的掩碼,下一部分同樣會(huì)講解位運(yùn)算操作符。

位運(yùn)算操作符

以下是Java中四個(gè)常見(jiàn)的位操作符:

  •  ~ – 按位取反
  •  & – 按位與
  •  ~ – 按位異或
  •  | – 按位或
  •  簡(jiǎn)單應(yīng)用如下(簡(jiǎn)單起見(jiàn),只展示二進(jìn)制)
1010 & 0101 == 0000
1100 & 0110 == 0100
1010 | 0101 == 1111
1100 | 0110 == 1110
~1111 == 0000
~0011 == 1100
1010 ^ 0101 == 1111
1100 ^ 0110 == 1010

比如,你可以通過(guò)“或”運(yùn)算,把一個(gè)二進(jìn)制數(shù)上的指定位“設(shè)置”為1,并且不會(huì)影響到其他位。

10000001 | 00100000 = 10100001 /* 第五位設(shè)為1 */
10000001 | 1 << 5 = 10100001 /* 同樣作用 */
00000000 | 1 << 2 | 1 << 5 = 00100100

如果你想要選擇性的把某位設(shè)為0,你可以讓數(shù)與一個(gè)全1但是某位為0的數(shù)相與。

01010101 & ~(1<<2) == 01010101 & 11111011 == 01010001

關(guān)于位順序

假設(shè)最高位是在左邊:

10010110
^   ^
|   |------- 第 0 位
|
|-------------- 第 7 位

注意,第0位的值是2^0,第一位是2^1,……,第7位的值是2^7。

使用ParseInt

在你的代碼里操作二進(jìn)制數(shù)字的便利方法是使用Integer.parseInt()方法。Integer.parseInt(“101″,2)代表著把二進(jìn)制數(shù)101轉(zhuǎn)換為十進(jìn)制數(shù)(5)。這意味著,利用這個(gè)方法你甚至可以在for循環(huán)里使用二進(jìn)制數(shù)字:

/* 從5到15的循環(huán) */
for (int b = Integer.parseInt("0101",2); b <= Integer.parseInt("1111",2); b++) {
  /* 做些什么 */
}

位讀寫

建議:自己實(shí)現(xiàn)一個(gè)用來(lái)把二進(jìn)制位(比特)轉(zhuǎn)換為流并讀寫的類,盡量不要使用Java的輸入輸出流,因?yàn)镴ava的流只能按字節(jié)操作。你會(huì)覺(jué)得“給我接下來(lái)的N個(gè)比特”和“把指針往前移M位”這種功能是非常實(shí)用的。比如,你可以讀取足夠的數(shù)據(jù)來(lái)確定最長(zhǎng)的霍夫曼編碼的長(zhǎng)度,當(dāng)你得到你剛剛讀取的霍夫曼編碼的實(shí)際長(zhǎng)度之后,你就可以把指針往前移相應(yīng)長(zhǎng)度。一個(gè)這樣的類可以把位運(yùn)算丑陋的一面劃分成一個(gè)眼熟的代碼塊。

類似的,如果你追求速度的話,那你會(huì)意外的發(fā)現(xiàn)表查找是如此強(qiáng)大。假如你有一個(gè)霍夫曼編碼以0開(kāi)頭,并且其他的編碼長(zhǎng)度均為3而且以1開(kāi)頭,這意味著你需要一個(gè)可以容納8(2^3)個(gè)項(xiàng)的表格,你的表格可能是這樣的:

char code[8];
int codelen[8];
code[0] = 'a'; codelen[0] = 1;
code[1] = 'a'; codelen[1] = 1;
code[2] = 'a'; codelen[2] = 1;
code[3] = 'a'; codelen[3] = 1;
code[4] = 'b'; codelen[4] = 3;
code[5] = 'c'; codelen[5] = 3;
code[6] = 'd'; codelen[6] = 3;
code[7] = 'e'; codelen[7] = 3;

通過(guò)兩次查找,你就可以定位到你要找的字符,并且還可以知道下一個(gè)字符在前面多少位置。這可要比某些一遍遍的循環(huán)去查找全部字符要?jiǎng)澦愕亩啵哺?jié)省內(nèi)存。

以上所述是小編給大家介紹的Java二進(jìn)制操作(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • java中List去除重復(fù)數(shù)據(jù)的5種方式總結(jié)

    java中List去除重復(fù)數(shù)據(jù)的5種方式總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于java中List去除重復(fù)數(shù)據(jù)的5種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • PowerJob的TimingStrategyHandler工作流程源碼解讀

    PowerJob的TimingStrategyHandler工作流程源碼解讀

    這篇文章主要為大家介紹了PowerJob的TimingStrategyHandler工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Java設(shè)計(jì)模式之單例模式簡(jiǎn)介

    Java設(shè)計(jì)模式之單例模式簡(jiǎn)介

    這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式簡(jiǎn)介,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Spring實(shí)戰(zhàn)之協(xié)調(diào)作用域不同步的Bean操作示例

    Spring實(shí)戰(zhàn)之協(xié)調(diào)作用域不同步的Bean操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之協(xié)調(diào)作用域不同步的Bean操作,結(jié)合實(shí)例形式分析了Spring協(xié)調(diào)作用域不同步的Bean相關(guān)配置及使用技巧,需要的朋友可以參考下
    2019-11-11
  • Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理詳解

    Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理詳解

    我們?cè)谧鯳eb應(yīng)用的時(shí)候,請(qǐng)求處理過(guò)程中發(fā)生錯(cuò)誤是非常常見(jiàn)的情況。下面這篇文章主要給大家介紹了關(guān)于Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-09-09
  • SpringBoot持久化層操作支持技巧

    SpringBoot持久化層操作支持技巧

    這篇文章主要介紹了SpringBoot持久化層操作支持技巧,需要的朋友可以參考下
    2017-10-10
  • Java泛型extends關(guān)鍵字設(shè)置邊界的實(shí)現(xiàn)

    Java泛型extends關(guān)鍵字設(shè)置邊界的實(shí)現(xiàn)

    這篇文章主要介紹了Java泛型extends關(guān)鍵字設(shè)置邊界的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java日期時(shí)間使用方法匯總

    Java日期時(shí)間使用方法匯總

    這篇文章主要針對(duì)Java日期時(shí)間使用方法進(jìn)行匯總,感興趣的朋友可以參考一下
    2016-03-03
  • SpringBoot詳細(xì)列舉常用注解的說(shuō)明

    SpringBoot詳細(xì)列舉常用注解的說(shuō)明

    在開(kāi)發(fā)SpringBoot程序的過(guò)程中,有可能與其他業(yè)務(wù)系統(tǒng)進(jìn)行對(duì)接開(kāi)發(fā),獲取封裝公共的API接口等等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot常見(jiàn)的注解的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Maven發(fā)布Jar包中文亂碼解決方法

    Maven發(fā)布Jar包中文亂碼解決方法

    這篇文章主要介紹了Maven發(fā)布Jar包中文亂碼解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評(píng)論