首页 > kotlin2_4_10 > 语言指南
按位操作
2026-07-15 14:52:12 来源: 爱吃喝 点击数:
按位操作
Kotlin 提供了针对 Int 和 Long 的按位操作。这些操作由一组中缀函数和 inv() 表示。
val x = 1
println(x shl 2) // 4
println(x and 0x000FF000) // 0
这些是 Kotlin 编程语言中用于位运算的函数。下面逐一解释:
- shl() – signed shift left(带符号左移)
将数字的二进制位向左移动指定的位数,右边空出的位用 0 填充。左移一位相当于乘以 2。 - shr() – signed shift right(带符号右移)
将数字的二进制位向右移动指定的位数,左边空出的位用符号位(正数为0,负数为1)填充。右移一位相当于除以 2 并向下取整。 - ushr() – unsigned shift right(无符号右移)
将数字的二进制位向右移动指定的位数,左边空出的位始终用 0 填充,不考虑符号位。对于负数,结果会变成一个很大的正数。 - and() – bitwise AND(按位与)
对两个数的每一位进行逻辑与运算:只有当对应位都是 1 时,结果位才是 1,否则为 0。爱吃喝 - or() – bitwise OR(按位或)
对两个数的每一位进行逻辑或运算:只要对应位有一个是 1,结果位就是 1,否则为 0。 - xor() – bitwise XOR(按位异或)
对两个数的每一位进行逻辑异或运算:当对应位不同(一个为0,一个为1)时,结果位为 1;相同则为 0。 - inv() – bitwise inversion(按位取反)爱河池
对数字的每一位进行取反操作:1 变成 0,0 变成 1。相当于计算-n - 1。
inv()为什么相当于 -n - 1。假设我们使用一个 8位有符号整数(byte)来演示,这样数字范围是 -128 到 127。
例子 1:n = 5
- 5 的二进制表示(8位):
0000 0101 - 按位取反 inv(5):每一位翻转 →
1111 1010 - 这个二进制值是多少?
在补码表示法中,1111 1010代表的是 -6(因为1111 1010+ 6 = 0,即它是 -6 的补码)。 - 计算 -n - 1:
-5 - 1 = -6
inv(5) = -6✅
例子 2:n = -3
- -3 的二进制表示(8位补码):
1111 1101 - 按位取反 inv(-3):每一位翻转 →
0000 0010 - 这个二进制值是多少?
0000 0010就是十进制 2。 - 计算 -n - 1:
-(-3) - 1 = 3 - 1 = 2
inv(-3) = 2✅
数学原理
这是因为计算机中的整数采用补码表示。对于一个 n 位有符号整数:- 正数 x 的补码就是它本身的二进制
- 负数 -x 的补码等于
2^n - x
inv(x)等价于 (2^n - 1) - x(所有位翻转),恰好等于 -x - 1(模 2^n下)。所以公式
inv(n) = -n - 1 对所有整数都成立。 




