最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

移位

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

/* 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

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

你可以使用叫作“無符號右移”運算符的第三個操作符:>>> 來實現(xiàn)以“0”填充的移位,這種移位會忽略符號位并總是用“0”來填充。

/* 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。

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

00001000的掩碼,代碼十分簡單:

int bitmask = 1 << 3;

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

位運算操作符

以下是Java中四個常見的位操作符:

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

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

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

如果你想要選擇性的把某位設(shè)為0,你可以讓數(shù)與一個全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)。這意味著,利用這個方法你甚至可以在for循環(huán)里使用二進(jìn)制數(shù)字:

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

位讀寫

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

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

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;

通過兩次查找,你就可以定位到你要找的字符,并且還可以知道下一個字符在前面多少位置。這可要比某些一遍遍的循環(huán)去查找全部字符要劃算的多,也更節(jié)省內(nèi)存。

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

相關(guān)文章

  • java抓包后對pcap文件解析示例

    java抓包后對pcap文件解析示例

    這篇文章主要介紹了java抓包后對pcap文件解析示例,需要的朋友可以參考下
    2014-03-03
  • Java基礎(chǔ)高級綜合練習(xí)題撲克牌的創(chuàng)建

    Java基礎(chǔ)高級綜合練習(xí)題撲克牌的創(chuàng)建

    今天小編就為大家分享一篇關(guān)于Java基礎(chǔ)高級綜合練習(xí)題撲克牌的創(chuàng)建,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java并發(fā)編程之CountDownLatch解讀

    Java并發(fā)編程之CountDownLatch解讀

    這篇文章主要介紹了Java并發(fā)編程之CountDownLatch解讀,是通過一個計數(shù)器來實現(xiàn)的,計數(shù)器的初始值是線程的數(shù)量,countDownLatch這個類使一個線程等待其他線程各自執(zhí)行完畢后再執(zhí)行,需要的朋友可以參考下
    2023-12-12
  • k8s部署springboot實現(xiàn)前后端分離項目

    k8s部署springboot實現(xiàn)前后端分離項目

    本文主要介紹了k8s部署springboot實現(xiàn)前后端分離項目,主要包括配置文件、鏡像構(gòu)建和容器編排等方面,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 詳解Spring Boot 部署jar和war的區(qū)別

    詳解Spring Boot 部署jar和war的區(qū)別

    本篇文章主要介紹了詳解Spring Boot 部署jar和war的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • SpringBoot2.x設(shè)置Session失效時間及失效跳轉(zhuǎn)方式

    SpringBoot2.x設(shè)置Session失效時間及失效跳轉(zhuǎn)方式

    這篇文章主要介紹了SpringBoot2.x設(shè)置Session失效時間及失效跳轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中的FutureTask源碼解析

    Java中的FutureTask源碼解析

    這篇文章主要介紹了Java中的FutureTask源碼解析,FutureTask是一個可取消的異步計算,這個類是Future的實現(xiàn)類,有開始和取消一個計算的方法,如果一個計算已經(jīng)完成可以查看結(jié)果,需要的朋友可以參考下
    2023-12-12
  • Mybatis中SqlMapper配置的擴(kuò)展與應(yīng)用詳細(xì)介紹(1)

    Mybatis中SqlMapper配置的擴(kuò)展與應(yīng)用詳細(xì)介紹(1)

    這篇文章主要介紹了Mybatis中SqlMapper配置的擴(kuò)展與應(yīng)用(1)的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • 淺談FileItem類的常用方法

    淺談FileItem類的常用方法

    下面小編就為大家?guī)硪黄獪\談FileItem類的常用方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • java用接口、多態(tài)、繼承、類計算三角形和矩形周長及面積的方法

    java用接口、多態(tài)、繼承、類計算三角形和矩形周長及面積的方法

    這篇文章主要介紹了java用接口、多態(tài)、繼承、類計算三角形和矩形周長及面積的方法,涉及java面向?qū)ο笾蓄?、接口、多態(tài)等的使用技巧,需要的朋友可以參考下
    2015-05-05

最新評論

通许县| 长寿区| 岢岚县| 和田县| 桂阳县| 禹州市| 罗平县| 平泉县| 安吉县| 开封市| 鸡泽县| 双流县| 朝阳县| 将乐县| 仲巴县| 绍兴县| 漳州市| 仁怀市| 平远县| 多伦县| 新郑市| 威海市| 唐山市| 荆门市| 施甸县| 凤庆县| 拉孜县| 普格县| 富民县| 肇庆市| 黄大仙区| 望城县| 长沙市| 祥云县| 上林县| 武胜县| 长沙县| 靖江市| 含山县| 宜兰市| 赤水市|