按位操作

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

  1. 5 的二进制表示(8位):0000 0101
  2. 按位取反 inv(5):每一位翻转 → 1111 1010
  3. 这个二进制值是多少?
    在补码表示法中,1111 1010代表的是 -6(因为 1111 1010+ 6 = 0,即它是 -6 的补码)。
  4. 计算 -n - 1-5 - 1 = -6
结果一致:inv(5) = -6

例子 2:n = -3

  1. -3 的二进制表示(8位补码):1111 1101
  2. 按位取反 inv(-3):每一位翻转 → 0000 0010
  3. 这个二进制值是多少?
    0000 0010就是十进制 2
  4. 计算 -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​ 对所有整数都成立。

上一篇:习语集合
下一篇:返回列表
关键字:

河池新闻

图说城市 图说天下

阅读排行 阅读排行


爱河池