一篇文章搞懂移位运算
Posted zhengwangzw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇文章搞懂移位运算相关的知识,希望对你有一定的参考价值。
前提知识:
1. 计算机中对于有符号数的表示有三种方式,原码,补码,反码。
2. 在Java中,二进制数最高位是符号位,0表示正数,1表示负数;
3. 正数的表示,例如byte/int 数3, 二进制就是 0000 0011,负数的表示稍微麻烦一点(负数在计算机中是以补码的形式存储的)
-5 的二进制:
1. -5的绝对值二进制表示 0000 0101
2. 然后求这个数的反码 1111 1010
3. 将反码加1 变成 1111 1011 , 这个就是-5的二进制表示(补码)
移位运算:
1. << 左移 (正负数一样)
例如 5 << 2,
5 的二进制 0101 , 5 << 2 变成 010100, 结果为 5 * 2 的 n次方 (n是移动位数)= 20
例如 -5 << 2,
-5 的二进制 1111 1011 , 5 << 2 变成 1110 1100, 结果为 -5 * 2 的 n次方 (n是移动位数)= -20
说明,从负数二进制转成10进制, - 1 ,然后取反, 加上符号位。 1110 1100 -1 = 1110 1011, 取反 0001 0100 = 20, 加上符号位 -20
代码:
2. >> 右移
例如 int 32位 65 >> 2 ,
65的二进制数 1000001 ,右移 补0 , 65 >> 2为 0010000, 65 / 2^n = 65 / 4 = 16.
-65的二进制数据 10111111,右移补1, -65 >> 2 为 11101111 (-17)
负数-x的除法可以用以下方法来代替:
(x + 2^N - 1) >> N
-65 右移二位为 65 + 2^2 - 1 >> 2 , 然后加上符号位。
2.1 有一种情况,如果移动位数超过最大位数,例如int数超过32位,循环移位其实是一样的,用移动位数%32,就是移动位数。
例如 65 移动34位,就是等同于移动2位(34 % 32 )
3. >>> 逻辑右移
例如 int -65 >>> 2
65的二进制数 11111111111111111111111110111111,
逻辑右移2位 00111111111111111111111111101111 变成无符号正整数
以上是关于一篇文章搞懂移位运算的主要内容,如果未能解决你的问题,请参考以下文章