美文网首页
位运算(1) -- 移位

位运算(1) -- 移位

作者: sunyelw | 来源:发表于2019-09-25 21:57 被阅读0次

位运算是二进制数的各种操作的统称, 本篇是移位操作.


  • 计算机中的位运算操作都是以其补码参与运算
  • 正数的三码(原码/反码/补码)一致
  • 负数的三码, 反码原码除符号位取反, 补码反码加一

下面我们直接上例子分别说说移位操作需要注意的点.

为了书写方便, 我们使用byte 来做演示. 实际运算会将byte类型转换为int类型计算

补位约定

  • 正数右移,高位用0补,
  • 负数右移,高位用1补,
  • 当负数使用无符号右移时,高位用0进行补位(自然由负数变成了正数)
  • 左移不管正数负数低位都是补0

正常情况

移位操作分三种

  • 左移<<
  • 右移>>
  • 无符号右移>>>

正数移位

正数左右移位都比较简单, 这里就各给一个例子, 大家看看就好

(1) 3 >> 1

0000 0011  原码/补码/反码

0000 0001  右移一位

移位后的结果也是正数, 那么其原码就是其自身

3 >> 1 = 2

(2) 1 << 7
转换为int计算

0000 ... 0000 0000 0001 原码/补码/反码 (中间省略16个0)
0000 ... 0000 1000 0000 左移七位

答案就是 128
让我们换一种写法:

(byte) (1 << 7)

前面过程与上面一致,到输出时有所不同:
转换为byte输出, 截取低八位得到

1000 0000

这是个负数呀, 继续转

1111 1111 取反
1000 0000 加一

这是多少? -0 ? 不是, 是 -128 (byte范围的最小负数)

  • 这里之所以写出来转换为int并且写满了32位, 是因为涉及到了这种临界点必须写出来不然结果就看不懂了, 上面也是会转的, 只是写不写出来结果都一样
  • intbyte 分三步
    • 拿到补码
    • 截掉前面三个字节
    • 当补码处理, 取原码

1 >> 9 是多少呢?

负数右移

-3 >> 1

原码         1000 0011

反码         1111 1100  (取反时符号位不动)

补码         1111 1101

右移一位     1111 1110  (这里得到的是补码)

根据补码取其原码,

取反 1000 0001
加一 1000 0010

所以

-3 >> 1 = -2

你猜猜 -3 >> 33 是多少? (那个圈~~)

因为 33 % 32 = 1, 所以

-3 >> 33 = -3 >> 1 = -2

无符号右移

就是连带符号位一起移动~

-1 >>> 1

1000 ... 0001 原码
1111 ... 1110  反码
1111 ... 1111 补码
0111 ... 1111 无符号右移一位

结果就是 2147483647
相信你应该看出来了, 正数的右移与无符号右移是一样一样的, 都是高位补0.


其实移位操作只要细心点加多动手画画基本不会错.

相关文章

  • 位运算(1) -- 移位

    位运算是二进制数的各种操作的统称, 本篇是移位操作. 计算机中的位运算操作都是以其补码参与运算 正数的三码(原码/...

  • 位运算

    位运算包括逻辑运算和移位运算,相应地,位运算符包括逻辑运算符(包括~、&、|和^)和移位运算符(包括>>、<<和>...

  • Java的位运算符详解实例

    1.与(&)、或(|)、非(~)、异或(^) 2.移位运算符 移位运算符操作的对象就是二进制的位,可以单独用移位运...

  • 17.位运算基础及实战要点

    17.位运算基础及实战要点 位运算符 算数移位与逻辑移位 位运算的应用 为什么需要位运算 机器里的数字表示方式和存...

  • 位运算与移位运算

    原码、反码、补码 对于有符号的数来说: 二进制的最高位是符号位:0表示正数,1表示负数; 示例:1 和 -1 的 ...

  • 2018-04-24 JAVA 移位运算符

    移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。有三种移位运算符 (<<,>>,>>>...

  • 位运算:包括按位与(&)、按位或(|)、异或(^)、按位取反(~)以及移位(<<,>>)。“与”同为‘1’为‘...

  • 第8周:文件——8.2 位运算

    1.按位运算 2.移位运算 3.位运算例子 4.位段 每个成员占几个比特,最后结构放到一个 int 里头。

  • 常见位运算及技巧

    移位运算 移位运算包含逻辑移位(logical shif) 和 算术移位(arithmetic shift)。 逻...

  • 运算符

    位移位运算 如 UIViewAutoresizingFlexibleHeight = 1 << 4, 1.左移运算...

网友评论

      本文标题:位运算(1) -- 移位

      本文链接:https://www.haomeiwen.com/subject/gqquuctx.html