数据结构与算法-位运算

位运算

如何打印一个整数的二进制?在实现这段代码之前,先来了解一下计算机中对于整数是如何存储的。

原码、补码、反码

原码

定义:原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

 9=0000 1001
-9=1000 1001

补码

补码(英语:2's complement):是一种用二进制表示有符号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。 补码以有符号比特的二进制数定义。正数和0的补码就是该数字本身再补上最高位元0。负数的补码则是将其绝对值按位取反再加1。

 9=0000 1001
-9=1111 0111

补码的计算规则

  1. 补码运算时,其符号位与数值部分一起参加运算。
  2. 补码的符号位相加后,如果有进位出现,要把这个进位舍去(自然丢失)。
  3. 用补码运算,其运算结果亦为补码。

反码

将二进制数每个数字反转,得到的数即为原二进制的一的补码(英语:ones' complement)。若某一位为0,则使其变为1,反之亦然。

 9=0000 1001
-9=1111 0110

整数以补码的方式存储

在计算机中码,整数是以补码进行存储。原因有以下点:

  1. 统一 +0 和 -0 的表示方式;
  2. 对于有符号整数进行统一计算;
  3. 补码计算效率更高;

+0 和 -0

首先来看下以原码、反码、补码对有符号 0 的表示:

原码:
+0=0000 0000
-0=1000 0000
反码:
+0=0000 0000
-0=1111 1111
补码
+0=0000 0000
-0=0000 0000

通过比较可以看到,补码在表示 -0 的时候,溢出的高位直接丢弃,最终二进制表示和 +0 一致,这是其他两个整数表示方式无法做到的。

统一计算

计算机最底层的算法应该是统一的,而不是需要针对不同的符号进行特定的算法,这无疑会增加 CPU 指令以及底层电子原件设计的难度。举个例子来说明:

-1 + 1 = 0

如果使用原码计算,带上符号位一起:

1000 0001
0000 0001
1000 0010

带上符号位计算,得到结果为 -2,这显然是不对的。

如果使用反码计算,带上符号位

1111 1110
0000 0001
1111 1111

带上符号位计算,得到结果为 -2^6,这个计算结果同样也不对。

使用补码计算,带上符号位一起:

1111 1111
0000 0001
0000 0000

带上符号位计算,得到的结果为 0,高位溢出直接丢弃。

通过计算比较,可见只有补码带上符号位计算的时候,计算结果是一致的。

计算效率高

通过前面的例子也可以看出,补码的运算是可以将减法转换成加法。这样依赖就不需要实现减法的 CPU 指令,并且在设计电子元器件的时候只需设置加法器。另一方面补码运算不需要考虑最高位溢出的情况,一旦发生溢出直接丢弃,计算效率更高。

位移运算符

<<(左移)

“<<”运算符执行左移位运算。在移位运算过程中,符号位始终保持不变。如果右侧空出位置,则自动填充为 0;超出 32 位的值,则自动丢弃。

>>(右移)

“>>”运算符执行有符号右移位运算。与左移运算操作相反,它把 32 位数字中的所有有效位整体右移,再使用符号位的值填充空位。移动过程中超出的值将被丢弃。

>>>(无符号右移)

“>>>”运算符执行五符号右移位运算。它把无符号的 32 位整数所有数位整体右移。对于无符号数或正数右移运算,无符号右移与有符号右移运算的结果是相同的。

对于负数来说,无符号右移将使用 0 来填充所有的空位,同时会把负数作为正数来处理,所得结果会非常大所以,使用无符号右移运算符时要特别小心,避免意外错误。

按位与、或、异或等运算方法

按位与运算符(&)

参加运算的数据,按二进制位进行“与”运算,运算规则如下:

两位同时为“1”,结果才为“1”,否则为0。另外,负数按补码形式参加按位与运算。

按位或运算符(|)

参加运算的数据,按二进制位进行“或”运算,运算规则如下:

参加运算的两个对象只要有一个为1,其值为1。另外,负数按补码形式参加按位或运算。

异或运算符(^)

参加运算的数据,按二进制位进行“异或”运算,运算规则如下:

参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。同样负数按补码形式参加运算。

取反运算符(~)

参加运算的一个数据,按二进制位进行“取反”运算。运算规则如下:

对一个二进制数按位取反,即将0变1,1变0。同样负数按补码形式参加运算。

打印整数的二进制

在了解位运算之后,此时再来分析,如果打印一个整数的二进制。

展开阅读全文

页面更新:2024-05-04

标签:反码   补码   正数   负数   数据结构   整数   高位   算法   符号   形式   规则   数字

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top