一、& 按位与
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
应用:
(1)清零
若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:
原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。
a 00101011
b 10010100
c 00000000 //c = a & b
(2)取一个数中某些指定位
若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。
a 00101100 10101100
b 00000000 11111111
c 00000000 10101100 //c = a & b
(3)保留指定位:
a 01010100
b 00111011
c 00010000 //c = a & b
二、| 按位或
两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,一真为真
应用:将一个数据的某些位定值为1
a 00110000
b 00001111
c 00111111 //c = a | b
三、^ 按位异或
若参加运算的两个二进制位值相同则为0,否则为1
应用:不用临时变量,交换两个值
计算前:
a=3,即011(2);b=4,即100(2)
计算过程:
a=a ^ b; //即111 = 011 ^ 100
b=b ^ a; //即011 = 100 ^ 111
a=a ^ b; //即100 = 111 ^ 011
计算后:
a=100(2)即 4 ;b = 011(2)即 3;
四、~ 取反
~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
五、<< 左移
用来将一个数的各二进制位全部左移N位,右补0
六、>> 右移
将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
七、原码, 反码, 补码的基础概念和计算方法
在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念《杂谝桓鍪? 计算机要使用一定的编码方式进行存储。原码, 反码, 补码是机器存储一个具体数字的编码方式.
(1)原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值.
比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111] 即 [-127 , 127]
原码是人脑最容易理解和计算的表示方式。
(2)反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
(3)补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
计算机中带符号的整数为何采用二进制的补码进行存储
1)使符号位能与有效值部分一起参加运算,从而简化运算规则。从而可以简化运算器的结构,提高运算速度;(减法运算可以用加法运算表示出来。)
2)加法运算比减法运算更易于实现。使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。【从补码运算的特征理解!】
计算机使用补码表示负整数!正整数就用源码来表示。那什么是补码呢?其实源码的补码就是源码的相反数,他们相加得0 。
计算负整数的补码:
规则就是源码各位取反,然后加1得到。
例如:如果我们用8位来表示有符号整数的话,那么十进制1用二进制表示为:
- 00000001
00000001
这个数取反加1的结果是:
- 11111111
11111111
所以,-1的补码就是11111111。
大家可能会有疑问,到底什么是补码,为什么-1的补码不是-1的源码取反加1呢?
这是因为:-1的补码是1的补码表示法。所以计算机里用1的相反数(就是-1的补码)来表示-1 。
计算二进制有符号数的十进制数(负二进制---10进制) 取反加1加负号
既然有符号数在计算机里有补码表示负整数,那我们如何根据给定的二进制数来计算十进制数呢?
看例子:
假设给了一个数:10000100
看符号位为1,为负数,所以这个数是用补码表示的!先计算源码。
各位取反加1的结果是:01111100(二进制) = 124(十进制)
01111100(二进制) = 124(十进制)
所以原先给出的二进制数的十进制数是 -124 。
计算负整数的二进制补码表示(负10进制--2进制) 计算正二进制 取反加1
继续刚才那个例子,如果我们拿到的是十进制-124,那么他的二进制补码是多少呢?
其实他的补码就是124的二进制数求补的结果。
124的二进制数为:01111100
取反 :10000011
加1 :10000100
所以-124的二进制补码表示就是10000100
为什么使用补码表示负整数
原因很简单,如果使用补码表示负整数,那么ALU在做整数之间的操作时,就不用区分符号了,所有位都会参与运算,其上上面的例子中,符号位都参与了运算。
例如执行2-1这个操作,我们可以用2+(-1)来计算。
2的二进制数是:00000010
1的二进制数是:00000001 --> -1的二进制补码是:11111111
所以2+(-1):
- 00000010
- + 11111111
- ----------------
- 00000001
00000010
+ 11111111
----------------
00000001
结果是1。
我们再看个结果为负数的。
求1-2的结果,用1+(-2)来计算。
2的二进制数是:00000010,所以-2的二进制数为:11111101+1=11111110
1+(-2)的计算过程是:
- 00000001
- + 11111110
- ---------------
- 11111111
00000001
+ 11111110
---------------
11111111
这个结果的十进制数是多少呢?
首先它是个负数,说明结果使用补码表示的,将各位取反加1后的结果是00000001=1(十进制),然后加上他的符号,就是-1了,
所以1+(-2)的结果是-1 。
用补码计算确实简化了ALU的设计难度!!所以计算机用补码来表示负整数!!!!
(负二进制---10进制) 取反加1加负号
负10进制--2进制) 计算正二进制 取反加1(正数的相反数)
1)使符号位能与有效值部分一起参加运算,从而简化运算规则。从而可以简化运算器的结构,提高运算速度;(减法运算可以用加法运算表示出来。)
2)加法运算比减法运算更易于实现。使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。【从补码运算的特征理解!】
计算机使用补码表示负整数!正整数就用源码来表示。那什么是补码呢?其实源码的补码就是源码的相反数,他们相加得0 。
计算负整数的补码:
规则就是源码各位取反,然后加1得到。
例如:如果我们用8位来表示有符号整数的话,那么十进制1用二进制表示为:
- 00000001
00000001
这个数取反加1的结果是:
- 11111111
11111111
所以,-1的补码就是11111111。
大家可能会有疑问,到底什么是补码,为什么-1的补码不是-1的源码取反加1呢?
这是因为:-1的补码是1的补码表示法。所以计算机里用1的相反数(就是-1的补码)来表示-1 。
计算二进制有符号数的十进制数(负二进制---10进制) 取反加1加负号
既然有符号数在计算机里有补码表示负整数,那我们如何根据给定的二进制数来计算十进制数呢?
看例子:
假设给了一个数:10000100
看符号位为1,为负数,所以这个数是用补码表示的!先计算源码。
各位取反加1的结果是:01111100(二进制) = 124(十进制)
01111100(二进制) = 124(十进制)
所以原先给出的二进制数的十进制数是 -124 。
计算负整数的二进制补码表示(负10进制--2进制) 计算正二进制 取反加1
继续刚才那个例子,如果我们拿到的是十进制-124,那么他的二进制补码是多少呢?
其实他的补码就是124的二进制数求补的结果。
124的二进制数为:01111100
取反 :10000011
加1 :10000100
所以-124的二进制补码表示就是10000100
为什么使用补码表示负整数
原因很简单,如果使用补码表示负整数,那么ALU在做整数之间的操作时,就不用区分符号了,所有位都会参与运算,其上上面的例子中,符号位都参与了运算。
例如执行2-1这个操作,我们可以用2+(-1)来计算。
2的二进制数是:00000010
1的二进制数是:00000001 --> -1的二进制补码是:11111111
所以2+(-1):
- 00000010
- + 11111111
- ----------------
- 00000001
00000010
+ 11111111
----------------
00000001
结果是1。
我们再看个结果为负数的。
求1-2的结果,用1+(-2)来计算。
2的二进制数是:00000010,所以-2的二进制数为:11111101+1=11111110
1+(-2)的计算过程是:
- 00000001
- + 11111110
- ---------------
- 11111111
00000001
+ 11111110
---------------
11111111
这个结果的十进制数是多少呢?
首先它是个负数,说明结果使用补码表示的,将各位取反加1后的结果是00000001=1(十进制),然后加上他的符号,就是-1了,
所以1+(-2)的结果是-1 。
用补码计算确实简化了ALU的设计难度!!所以计算机用补码来表示负整数!!!!