正文
那假如相乘的两个数都不满足2^N怎么办呢?其实这个时候编译器会将其中一个数拆分成多个满足2^N的数相加的情况,打个比方
int a = 15; int a = 15
int b = 13; => int b = (4 + 8 + 1)
int c = a * b; int c = a * b
最后其实执行相乘运算就会变成这样
15 * 4 + 15 * 8 + 15 * 1
,按照上文说的移位来转换为位运算就会变成
15 << 2 + 15 << 3 + 15 << 0
####减法和除法
减法也是与加法同理只不过计算机内减法操作就是加上一个数的负数形式,且在操作系统中都是以补码的形式进行操作(因为正数的源码补码反码都与本身相同)。首先, 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.
除法的话其实和乘法原理相同,不过乘法是左移而除法是右移,但是除法的计算量要比乘法大得多,其大部分的消耗都在拆分数值,和处理小数的步骤上,所以如果我们在进行生成变量的时候如果遇到多位的小数我们尽量把他换成string的形式,这也是为什么浮点运算会消耗大量的时钟周期(操作系统中每进行一个移位或者加法运算的过程所消耗的时间就是一个时钟周期,3.0GHz频率的CPU可以在一秒执行运算3.0
1024
1024*1024个时钟周期)
11:位运算符
使用的运算符包括下面:
含义
|
运算符
|
例子
|
左移
|
<<
|
0011 => 0110
|
右移
|
>>
|
0110 => 0011
|
按位或
|
︳
|
0011
------- => 1011
1011
|
按位与
|
&
|
0011
------- => 1011
|