Kotlin位運算

Kotlin 提供了幾種用于操作整數各個位(bit) 的運算符。這些操作是由處理器直接支持的,速度快且操作簡單。在底層編程中非常重要,比如設備驅動、低級圖形處理、網絡通信、加密和壓縮等。

盡管計算機通常都有高效的硬件指令來執行算術和邏輯操作,但所有這些操作也都可以通過組合按位操作符位移操作符判斷 0 操作來實現。


位運算符(Bitwise Operators)

共有四種位運算符:

  • inv():按位非(NOT),即取反或補碼

  • or:按位或(OR)

  • and:按位與(AND)

  • xor:按位異或(XOR)

這些運算符會一位一位地處理操作數的每一位,并生成一個新的數值。

  • inv() 是一元運算符,它會將每一位的 0 變為 1,1 變為 0(包括符號位也會改變)。

  • or 是二元運算符,按位“或”:只要任意一個操作數為 1,結果就是 1,否則是 0。

  • and 是按位“與”:只有兩個操作數都為 1,結果才是 1,否則是 0。

  • xor 是按位“異或”:當兩個操作數中正好一個為 1 時,結果是 1,否則是 0。

這些運算符不僅可以作用于整數,也可以作用于布爾類型。如果是整數,進行的是位運算;如果是布爾值,進行的是邏輯運算(除了 inv() 不能用于布爾類型)。


示例:按位與、或、異或

val first = 15  // 二進制:1111
val second = 10 // 二進制:1010val bitwiseAnd = first and second // 1111 & 1010 = 1010,結果是 10
val bitwiseOr = first or second   // 1111 | 1010 = 1111,結果是 15
val bitwiseXor = first xor second // 1111 ^ 1010 = 0101,結果是 5

示例:按位取反(inv)

val first = 35   // 二進制:0..00100011
val second = -35 // 二進制:1..11011101(補碼)val inverseFirst = first.inv()     // ~35 = -36
val inverseSecond = second.inv()   // ~-35 = 34

為什么 ~35 = -36?這是因為 Kotlin 使用**補碼(two’s complement)**來表示整數。

  • 對任意正整數 n,其按位取反是 -(n + 1)

  • 對負數 -n,其按位取反是 n - 1


檢查一個數是否能被 2 整除(使用 and

val a = 5
val b = 4val bitwiseAndA = a and 1 // 101 & 001 = 001,結果是 1 => 有余數,不能整除
val bitwiseAndB = b and 1 // 100 & 001 = 000,結果是 0 => 沒有余數,可以整除

位移操作符(Bit-shift Operators)

Kotlin 還提供了三種位移操作符:

  • shl:左移(乘法),低位補零;

  • shr:帶符號右移,高位填符號位(保留正負號);

  • ushr:無符號右移,高位補零(結果永遠為正)。

示例:通過位移實現快速乘除法

var value = 25   // 二進制:0001 1001value = value shl 1 // 左移1位:0011 0010 => 50
value = value shl 2 // 再左移2位:1100 1000 => 200var anotherVal = 14
anotherVal = anotherVal shr 1 // 右移1位:0111 => 7

我們可以總結出:

var newVal = 25newVal = newVal shl 1 // 25 * 2^1 = 50
newVal = newVal shl 3 // 50 * 2^3 = 400
newVal = newVal shr 2 // 400 / 2^2 = 100

示例:使用位移求區間中點

val left = 10
val right = 20val mid = (left + right) shr 1 // 結果是 15

(left + right) / 2 相同,但位移方式更快。


示例:shrushr 的區別

val number1 = 5
val number2 = -5val shrNumber1 = number1 shr 1     // 0101 → 0010,結果是 2
val ushrNumber1 = number1 ushr 1   // 同上,結果是 2
val shrNumber2 = number2 shr 1     // 保留符號,結果是 -3
val ushrNumber2 = number2 ushr 1   // 補零,結果是 2147483645
  • shr 會根據符號保留符號位。

  • ushr 總是左邊補 0,所以負數也變為正數。


Kotlin 1.6 新增:位旋轉

val a = 4val shiftRight = a.rotateRight(1) // 0100 → 0010,結果是 2
val shiftLeft = a.rotateLeft(1)   // 0100 → 1000,結果是 8
val b = 3val shiftLeft = b.rotateLeft(1)   // 0011 → 0110,結果是 6
val shiftRight = b.rotateRight(1) // 0011 → 1..0001,結果是 -2147483647

rotateRight 會把最高位 1 移到符號位(第 31 位),結果變成負數。


運算優先級

Kotlin 中,位運算符和位移運算符的優先級低于加減乘除:

優先級(從高到低)運算符例子
括號(expr)
后綴自增自減expr++, expr--
前綴正負、自增自減-expr, ++expr, --expr
乘、除、模*, /, %
加減+, -
賦值及其組合=, +=, -=, *=
位運算和位移and, or, xor, shl, shr, ushr
位運算符之間是從左到右執行的。

例如:

val mid = left + right shr 1

無需加括號,是因為 + 的優先級高于 shr,相當于:

val mid = (left + right) shr 1

總結

在本節中,我們學習了如何對整數的進行操作,理解了位運算與一些算術運算之間的對應關系:

  • 位運算符:逐位處理。

  • 位移運算符:可以整體左移或右移一整串位。
    雖然位運算看起來稍顯復雜,但這是理解底層編程和高效計算的基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916514.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

墨者:通過手工解決SQL手工注入漏洞測試(MongoDB數據庫)

一、SQL手工注入漏洞測試(MongoDB數據庫) 本文以墨者學院靶場為例,演示MongoDB數據庫的手工SQL注入全過程。靶場以自己的地址為準:http://124.70.71.251:42286/new_list.php?id1 二、注入原理說明 MongoDB作為NoSQL數據庫,其注入方式與傳…

Kafka——CommitFailedException異常處理深度解析

引言在分布式消息系統Kafka的生態中,消費者組(Consumer Group)機制是實現高吞吐量和負載均衡的核心設計。然而,消費過程中位移提交(Offset Commit)的穩定性始終是開發者面臨的最大挑戰之一。當消費者嘗試提…

kafka的部署和jmeter連接kafka

zookeeper的安裝 kafka依賴Zookeeper所以要先安裝Zookeeper kafka的安裝文章引用來源:Kafka下載和使用(linux版)-CSDN博客 通過wget命令安裝 # 安裝wget https://downloads.apache.org/zookeeper/stable/apache-zookeeper-3.7.1-bin.tar.gz# 解壓tar…

Android UI 組件系列(八):ListView 基礎用法與適配器詳解

博客專欄:Android初級入門UI組件與布局 源碼:通過網盤分享的文件:Android入門布局及UI相關案例 鏈接: https://pan.baidu.com/s/1EOuDUKJndMISolieFSvXXg?pwd4k9n 提取碼: 4k9n 一、引言 在上一篇文章《Android UI 組件系列(…

Android學習專題目錄(持續更新)

1.Android 調試 1.1:Logcat日志分析 2.Android編譯 2.1:android編譯過程中的mk文件和bp文件的掃描機制 2.2:Android 構建系統中常見的 .mk 文件及其作用 2.3:Android構建系統中的mk文件語法函數 2.4:安卓中定…

c#Lambda 表達式與事件核心知識點整理

一、Lambda 表達式1. 概念 Lambda 表達式是一種匿名函數(無名稱的函數),簡化了委托和匿名方法的寫法,格式為: (參數列表) > 表達式或語句塊 它可以作為參數傳遞,或賦值給委托類型變量。2. 基本語法與簡寫…

Springboot+Layui英語單詞學習系統的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBootLayUI框架持久層框架MyBaits成功系統案例:參考代碼數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續輸…

主要分布于內側內嗅皮層的層Ⅲ的邊界向量細胞(BVCs)對NLP中的深層語義分析的積極影響和啟示

邊界向量細胞(Boundary Vector Cells, BVCs)主要分布于內側內嗅皮層(MEC)層Ⅲ,通過編碼環境邊界(如墻壁、障礙物)的距離和方向信息,為空間導航提供幾何參考框架。這一神經機制對自然…

Selenium是解決了什么問題的技術?

Selenium 是一種用于自動化瀏覽器操作的技術,主要解決了以下問題:1. 自動化測試 Selenium 最初是為了解決 Web 應用程序的自動化測試 問題而設計的。它可以幫助開發者和測試人員: 模擬用戶操作:如點擊按鈕、填寫表單、選擇下拉菜單…

JavaSE知識點(2)

目錄 訪問修飾符的區別 this關鍵字的作用 抽象類和接口有什么區別 抽象類可以定義構造方法嗎 但是接口不可以定義構造方法 Java支持多繼承嗎 接口可以多繼承嗎 繼承和抽象的區別? 抽象類和普通類的區別 成員變量和局部變量的區別? staic關鍵字…

(實用教程)Linux操作系統(二)

centos配置靜態ip 注意: 1.系統中的網關要與虛擬機編輯器中的網關保持一致 2.如果配置虛擬機編輯器后發現ping不通外網的時候,就要還原默認設置再進行配置 總結: 虛擬機編輯器需要配置ip,網關,其中ip網段以及最后一…

ThinkPHP8集成RabbitMQ的完整案例實現

ThinkPHP8集成RabbitMQ的完整案例實現一、安裝依賴:需通過Composer安裝php-amqplib庫?二、配置RabbitMQ三、生產者1、發送一個郵件,將任務發送到RabbitMQ隊列中。2、運行結果展示四、啟動消費者:命令行執行php think rabbitmq:consumer1&…

解密負載均衡:如何輕松提升業務性能

什么是負載均衡 負載均衡:Load Balance,簡稱LB,是一種服務或基于硬件設備等實現的高可用反向代理技術,負載均衡將特定的業務(web服務、網絡流量等)分擔給指定的一個或多個后端特定的服務器或設備,從而提高了 公司業務的…

mac neo4j install verifcation

本文使用conda環境安裝,neo4j所依賴jdk也采用conda install的方式安裝。 1 neo4j下載 點擊如下鏈接,選擇community, Linux/Mac Executor,點擊Download Community。 本文下載的安裝包是 neo4j-community-2025.06.2-unix.tar.gz 2 安裝neo4j …

【Oracle】Oracle分區表“排雷“指南:當ORA-14400錯誤找上門時如何優雅應對

引言:分區表里的"定時炸彈"凌晨三點的機房,你盯著屏幕上刺眼的ORA-14400: 插入的分區鍵值超出所有分區范圍錯誤,后背發涼。這個錯誤就像埋在分區表里的定時炸彈,一旦觸發就會讓整個應用癱瘓。但別慌!本文將帶…

設計模式(十四)行為型:職責鏈模式詳解

設計模式(十四)行為型:職責鏈模式詳解職責鏈模式(Chain of Responsibility Pattern)是 GoF 23 種設計模式中的行為型模式之一,其核心價值在于將多個處理對象(處理器)連接成一條鏈&am…

WAIC 2025 熱點解讀:如何構建 AI 時代的“視頻神經中樞”?

一、🌐 WAIC 2025 大會看點:AI 正在“長出眼睛與身體” 在 2025 年的人工智能大會(WAIC 2025)上,“大模型退幕后,具身智能登場”成為最具共識的趨勢轉向。從展區到主論壇,再到各大企業發布的新…

OpenCV+Python

安裝 OpenCV: Python:直接 pip install opencv-python(核心庫)和 opencv-contrib-python(擴展功能)。 pip install opencv-python pip install opencv-contrib-python 驗證安裝: import cv2…

現代C++的一般編程規范

一般情況下不要使用std::endl,尤其是在循環中,因為可能一開始你只是想要打印一個換行符,但是"endl"做的更多,其還會刷新緩沖區,這會額外花費很多時間,相反,只需要使用“\n"&…

38.安卓逆向2-frida hook技術-過firda檢測(三)(通過SO文件過檢測原理)

免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動! 內容參考于:圖靈Python學院 工具下載: 鏈接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…