前言
位运算应该是入门的基础知识,但是真正使用的人特别的少(移动端)。这么多年我只在一家公司的项目上看到了位运算的使用,而当我要修改这部分代码的时候,确是非常费劲,因为这部分知识都已经还给了老师,为此我特地复习一下位运算的基础知识。下面是我复习的内容,易读而且还清晰。
左移 shl
上🌰
val a = 2 shl 2
val b = 3 shl 1
val c = 4 shl 4
println("a = $a , b = $b , c = $c")
//a = 2 * 2的2次方 = 8
//b = 3 * 2的1次方 = 6
//d = 4 * 2的4次方 = 64
大家打印下日志,看看是否和计算规则一致,通过计算得出一个通用的公式 *m shl n = m (2的n次方) 这就是左移的计算规则
右移 shr
上🌰
val e = 3 shr 2
val f = 4 shr 1
val g = 6 shr 4
println("e = $e , f = $f , g = $g")
// e = 3 / 2的2次方 = 0
// f = 4 / 1的2次方 = 2
// g = 6 / 4的2次方 = 0
大家打印下日志,看看是否和计算规则一致,通过计算得出一个通用的公式 m shr n = m /(2的n次方) 这就是右移的计算规,补充一下:咱们看e的结果是0,即3/4=0,通过这个大家也看出来了,计算是向下取整的
无符号右移 ushr
上🌰
val oldNum = -5
val shr52 = -5 shr 2 // 向右移移动 向下取正 m除以2的n次方
val ushr52 = -5 ushr 2 // 向右移移动 向下取正 结果永远为正数
println("oldNum=$oldNum----" + Integer.toBinaryString(oldNum)) // 1111 1111 1111 1111 1111 1111 1111 1011
println("shr52=$shr52----" + Integer.toBinaryString(shr52)) // 1111 1111 1111 1111 1111 1111 1111 1110 向右移动两位 补两位 11
println("ushr52=$ushr52----" + Integer.toBinaryString(ushr52)) // 0011 1111 1111 1111 1111 1111 1111 1110 向右移动两位 补两位 00
我贴上了日志,以及相应的二进制。大家耐心观察下,可以看出之间的区别,无符号右移补位,右移几位,补几位0,而右移部位补的是当前符号如果为1则补1,如果是0则补0
与运算 and
上🌰
val andNum = 3 and 5 // 与运算
println("3=" + Integer.toBinaryString(3)) // 0011
println("5=" + Integer.toBinaryString(5)) // 0101
println("andNum=" + Integer.valueOf("0001", 2))
println(andNum)
依上图所示,大家可以看出3的二进制0011,5的二进制0101,
- 1 and 1 = 1,
- 1 and 0 = 0,
- 0 and 1 = 0,
- 0 and 0 = 0.
所以通过计算可以到3 and 5的结果二进制是0001。十进制为1
或运算 or
上🌰
val orNum = 9 or 10 // 或预算
println("9=" + Integer.toBinaryString(9)) // 1001
println("10=" + Integer.toBinaryString(10)) // 1010
println("or=" + Integer.valueOf("1011", 2))
println(orNum)
依上图所示,大家可以看到9的二进制是1001,10的二进制是1010
- 1 or 1 = 1
- 0 or 1 = 1
- 1 or 0 = 1
- 0 or 0 = 0
通过计算得到 9 or 10 的结果的二进制是1011 十进制为11
异或运算 xor
上🌰
val xorNum = 10 xor 11 // 异或运算
println("10=" + Integer.toBinaryString(10)) // 1010
println("11=" + Integer.toBinaryString(11)) // 1011
println("xor=" + Integer.valueOf("0001", 2))
println(xorNum)
依上图所示,可以看到10的二进制是1010 ,11的二进制是1011
- 1 xor 1 = 0
- 1 xor 0 = 1
- 0 xor 1 = 1
- 0 xor 0 = 0
通过计算得到 10 xor 11 的结果的二进制是 0001 十进制为1
结束
以上这些案例可以自己打印下,可以通过这些案例,快速的复习位运算。多尝试,多记录。 关于取反,补位等,暂时不录入进来。如果需要可以在评论区留言,需要的话,我在更新文章,最后祝大家前程似锦。