亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Kotlin基礎學習之位運算

2024-07-21 23:03:40
字體:
來源:轉載
供稿:網友

什么是位運算?

程序中的所有數在計算機內存中都是以二進制的形式儲存的。位運算說穿了,就是直接對整數在內存中的二進制位進行操作。比如,and運算本來是一個邏輯運算符,但整數與整數之間也可以進行and運算。舉個例子,6的二進制是110,11的二進制是1011,那么6 and 11的結果就是2,它是二進制對應位進行邏輯運算的結果(0表示False,1表示True,空位都當0處理):

110AND 1011———-0010 –> 2

由于位運算直接對內存數據進行操作,不需要轉成十進制,因此處理速度非常快。當然有人會說,這個快了有什么用,計算6 and 11沒有什么實際意義啊。這一系列的文章就將告訴你,位運算到底可以干什么,有些什么經典應用,以及如何用位運算優化你的程序。

引言

這個還真是基礎中的基礎,如果你跟我一樣之前沒有好好學習過Java基礎語法,這塊對你來說應該是一個懵逼點吧。不談底層什么的,單單從android編程來看,我們在加密算法還有網絡包處理等業務上使用位運算的頻率還是很高的,更別提Intent中的那些種類繁多的Flag了,因此學好這方面的基礎知識還是很重要的

本系列的例子使用的是Kotlin的語法,跟Java相比還是有所區別,請對照參考

無符號和有符號

在計算機中,可以區分正負的類型稱為有符號類型,沒有正負類型的稱為無符號類型。

一個字節為8位,從0開始算,那它的最高位就是第7位。同樣2個字節最高位為第15位,4個字節最高位為第31位。不同長度的類型,最高位不同,但是都是最左邊的那個。

無符號數中,所有的位都用于直接表示該值的大?。挥蟹枖抵凶罡呶挥糜诒硎菊?,0表示正數,1表示負數。因此同樣一個字節,無符號數最大值為255,有符號數最大值為127。有符號數最大值計算完全跟無符號數一樣,但是在負數范圍內就不能用剛才那種計算方式了,在計算機中,負數除了最高位為1以外,還采用補碼的形式,所以在計算中要對補碼進行還原

值得注意:的是JAVA的原始類型里沒有無符號整型,如果需要轉成無符號類型,可以用ushr

原碼、補碼、反碼

這個是高中就教過的知識,這里就不再做介紹

提醒一下,負數都是用補碼參與運算的,得到的也是補碼,需要減1取反獲得原碼。

位運算符

位運算主要在直接操控二進制數時進行使用,可以達到節約內存,使你的程序運行速度更快

Java定義了位運算符,可應用在整形(int)、長整型(long)、短整型(short)以及字符型(byte)等類型上。位運算符作用在所有的位上,并按位進行運算。Kotlin與之略有不同,它并沒有提供特殊的操作符,只提供了中綴形式的表示方法,并且Kotlin只可用在Int和Long類型上,這點千萬要記住

咱們來看一個例子

 val a1 = 60 val b1 = 13 var c1 = -5 // 與 println(a1 and b1) // 或 println(a1 or b1) // 異或 println(a1 xor b1) // 按位取反 println(a1.inv()) // 左移 println(a1.shl(1)) // 右移 println(a1.shr(1)) // 無符號右移 println(a1.ushr(1))

先看看結果,然后我們再一個個的分析

126149-611203030

我們知道,Java中的Int是4個字節32位的,那么a1與b1、c1轉換成二進制就應該是

val a1 = 60 // 0000 0000 0000 0000 0000 0000 0011 1100val b1 = 13 // 0000 0000 0000 0000 0000 0000 0000 1101var c1 = -5 // 1111 1111 1111 1111 1111 1111 1111 1011

隨后就是7種中綴表達式的計算規則

and 如果對應位都是1,則結果為1,否則為0

or 如果對應位都是0,則結果為0,否則為1

xor 如果對應位值相同,則結果為0,否則為1

inv 按位翻轉操作數的每一位,即0變成1,1變成0

shl 按位左移指定的位數,相當于乘以2的N次方。移掉的省略,右邊缺失的位,用0補齊

shr 按位右移指定的位數,相當于除以2的N次方,移掉的省略,左邊缺失的位,如果是正數則補0,若為負數,可能補0或補1,這取決于所用的計算機系統

ushr 按位右移指定的位數,移掉的省略,左邊缺失的位,用0補齊

所以我們來看看按位計算的結果(省略掉高位重復的0或者1,只看低八位)

通過上述規則,我們就能明白計算結果是怎樣得到的

“與”的結果就是00001100,即為12“或”的結果就是00111101,即為61“異或”的結果就是00110001,即為49“非a1”的結果就是11000011,即為-61“左移a1 1位”的結果就是01111000,即為120“右移a1 1位”的結果就是00011110,即為30“無符號右移a1 1位”的結果就是00011110,即為30

有一個很有趣的現象,對于一個Int類型的數值,無論你執行左移還是右移還是無符號右移,只要移動32位,效果跟沒有移動一致。這是因為在JAVA進行移位運算中因為Int是占32位,進行移位的數就是32的模,所以當數值移動32位的時候就等于數值移動0位,也相當于沒有進行移位。同理Long類型的移位,Long占8字節也就是64位,所以移位的數是64的模

應用舉例

有一個位運算口訣大家可以記一下:

清零取反要用與,某位置一可用或

若要取反和交換,輕輕松松用異或

判斷Int型變量a是奇數還是偶數

a1 and 1 = 0 // 偶數a1 and 1 = 0 // 奇數

獲取Int型變量的第K位(注:K從0開始依次由右往左,以下揭同)

a1 shr k and 1

將Int型變量的第K位清0

a1 and ((1 shl k).inv())

將Int型變量的第K位置1

a1 or (1 shl k)

平均值

(a1 and b1)+((a1 xor b1) shr 1)

不用temp交換兩個整數

a1 = a1 xor b1b1 = b1 xor a1a1 = a1 xor b1

獲取絕對值

val temp = c1 shr 31(c1 + temp) xor temp(c1 xor temp) - temp

獲取相反數

c1.inv()+1

Int轉byte數組

val bytes = ByteArray(4)bytes[0] = (a1 and 0xFF).toByte()bytes[1] = (a1 shr 8 and 0xFF).toByte()bytes[2] = (a1 shr 16 and 0xFF).toByte()bytes[3] = (a1 shr 24 and 0xFF).toByte()

補零擴展和補符號位擴展

在看這個問題之前,我們先做一個小游戲

val byte1: Byte = -127println(byte1)println(byte1.toInt())println(byte1.toInt() and 0xff)

看官請猜猜看呢

還是我來公布答案吧

-127-127129

能解釋一下為什么-127變成129嗎?這個就牽扯到補零擴展和補符號位擴展了

之前我們知道,Java是沒有無符號類型的,byte是8個字節而int是32個字節。在byte轉int的時候,肯定要將8位補到32位。Java中的擴展方式是補符號位擴展,所以-127通過補符號位擴展之后還是-127,即11111111 11111111 11111111 10000001。如果采用補零擴展,相當于11111111 11111111 11111111 10000001 and 11111111,這個值就是00000000 00000000 00000000 10000001,也就是129了

為了加深記憶,我再留一道題給大家思考

println(0x100000000L + 0xcafebabe.toInt())println(0x100000000L + 0xcafebabeL)

這兩個表達式打印出來也不一樣,現在你應該能明白為什么不一樣了吧

總結一下

Java中只有有符號數。當byte擴展到short,int時,因為符號位是0,所以正數都一樣,無論如何都是補零擴展;但負數補零擴展和按符號位擴展結果完全不同。

補符號位擴展,原數值不變。補零擴展,相當于把有符號數看成無符號數。

對于有符號數,默認采用符號位擴展。由小擴展到大時,需要用and 0xff這樣方式來確保是按補零擴展的;而從大向小時,符號位自動無效,所以不用處理。如果是char類型,那么不管它將要被擴展成什么類型,都執行補零擴展


注:相關教程知識閱讀請移步到kotlin教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产免费一区二区三区香蕉精| 亚洲天堂男人的天堂| 久久99精品久久久久久青青91| 亚洲电影免费观看高清| 精品国产一区二区三区久久久狼| 欧美性猛交xxxx乱大交3| 欧美亚洲一级片| 亚洲18私人小影院| 久久久国产一区| 国产精品成人av在线| 91在线精品视频| 一区二区三区视频免费| 国产99视频在线观看| 国产成人极品视频| 精品一区二区三区三区| 成人精品一区二区三区电影黑人| 91av在线精品| 久久精品国产久精国产思思| 日韩久久免费视频| 中文字幕免费精品一区高清| 国产日韩精品电影| 欧美日韩国产成人| 按摩亚洲人久久| 在线视频亚洲欧美| 日本成人在线视频网址| 国产精品96久久久久久又黄又硬| 国产精品久久久久久久久久尿| 欧美成人免费观看| 欧洲成人性视频| 日韩在线观看免费高清完整版| 国产成人激情小视频| 久久国产精品久久久久久| 国产精品ⅴa在线观看h| 热re91久久精品国99热蜜臀| 国产成人+综合亚洲+天堂| 亚洲理论在线a中文字幕| 亚洲在线观看视频| 国产这里只有精品| 国产福利成人在线| 亚洲3p在线观看| 亚洲欧美激情视频| 国产欧美精品日韩| 日韩精品欧美国产精品忘忧草| 日韩三级影视基地| 久久精品91久久香蕉加勒比| 欧美久久精品一级黑人c片| 在线观看中文字幕亚洲| 欧美精品一区二区三区国产精品| 国产成人精品综合| 欧美黑人性生活视频| 国产欧美日韩精品在线观看| 成人久久精品视频| 亚洲精品网址在线观看| 欧美中文字幕视频在线观看| 国产+成+人+亚洲欧洲| 国产精品白嫩美女在线观看| 社区色欧美激情 | 亚洲日本成人网| 一区二区三区视频在线| 奇米四色中文综合久久| 韩国三级电影久久久久久| 欧美激情视频免费观看| 久久久亚洲影院你懂的| 国产成人福利网站| 亚洲国产成人久久综合| 伊人久久久久久久久久久久久| 97视频在线观看免费高清完整版在线观看| 午夜精品久久久久久99热| 欧美与欧洲交xxxx免费观看| 亚洲国产天堂网精品网站| 日韩精品在线影院| 国产精品第8页| 欧美激情精品久久久久| 91在线视频九色| 日韩成人中文电影| 欧美激情精品久久久久久蜜臀| 国产婷婷97碰碰久久人人蜜臀| 色综合久综合久久综合久鬼88| 欧美xxxx14xxxxx性爽| 91在线精品播放| 久久久在线视频| 日韩中文字幕国产精品| 国产精品∨欧美精品v日韩精品| 正在播放国产一区| 亚洲欧美综合精品久久成人| 91九色视频导航| 国产精品免费一区豆花| 国产成人鲁鲁免费视频a| 亚洲精品永久免费| 日韩在线观看免费全| 97国产一区二区精品久久呦| 日韩成人av在线| 91精品久久久久久久久久久久久| 91精品久久久久久久久久另类| 色综合色综合网色综合| 热re99久久精品国产66热| 成人春色激情网| 欧美极品少妇xxxxⅹ喷水| 中文字幕最新精品| 久久青草福利网站| 欧美综合激情网| 91香蕉嫩草神马影院在线观看| 亚洲一区二区久久久久久久| 亚洲精品国偷自产在线99热| 亚洲国产精品va在线看黑人动漫| 亚洲免费小视频| 国产一区二区三区在线观看网站| 深夜福利日韩在线看| 色青青草原桃花久久综合| 亚洲丝袜av一区| 欧美精品激情在线| 国产精品永久在线| 国产成人一区二区在线| 欧美成人性色生活仑片| 精品毛片网大全| 成人黄色av播放免费| 国内精品美女av在线播放| 一区二区三区美女xx视频| 粗暴蹂躏中文一区二区三区| 精品久久久久久久久久国产| 欧日韩在线观看| 久久成年人免费电影| 中文日韩电影网站| 精品自拍视频在线观看| 成人免费福利视频| 555www成人网| 一区二区在线免费视频| 欧美日韩国产精品一区二区不卡中文| www.99久久热国产日韩欧美.com| 日韩欧美精品网址| 久久久av电影| 久久久久久九九九| 久久在精品线影院精品国产| 欧美视频在线观看 亚洲欧| 国产精品亚洲欧美导航| 久久九九热免费视频| 国产丝袜一区二区三区| 国产91在线高潮白浆在线观看| 欧美日韩国产一区二区| 97人洗澡人人免费公开视频碰碰碰| 日韩精品免费在线视频| 日韩美女写真福利在线观看| 91系列在线播放| 久久国内精品一国内精品| 欧美另类极品videosbestfree| 亚洲精品一区二区三区不| 色琪琪综合男人的天堂aⅴ视频| 日韩国产在线看| 成人福利在线视频| 在线看日韩欧美| 日韩经典一区二区三区| 国产成人精品在线播放| 久久在线免费观看视频| 精品一区二区三区三区| 一本色道久久88综合亚洲精品ⅰ| 97在线视频免费看| 国产精品亚洲视频在线观看| 91久久精品在线| 欧美精品情趣视频| 亚洲精品电影网在线观看| 日本高清+成人网在线观看| 国产精品欧美亚洲777777| 久久亚洲精品国产亚洲老地址| 一区二区三欧美|