百度云分享tp响应式网站开发国家标准下载网免费
news/
2025/9/27 8:04:25/
文章来源:
百度云分享tp响应式网站开发,国家标准下载网免费,上海网站建设 迈若,什么是优化电池充电首先介绍计算机的二进制码
二进制常用的有原码#xff0c;反码和补码#xff0c;他们都是由最左边的一个符号位和右边的数值位构成。在计算机中为了更低成本的计算#xff0c;数据都是用补码来存储和运算的。
原码
最高位表示符号位#xff08;0代表正数#xff0c;1代…
首先介绍计算机的二进制码
二进制常用的有原码反码和补码他们都是由最左边的一个符号位和右边的数值位构成。在计算机中为了更低成本的计算数据都是用补码来存储和运算的。
原码
最高位表示符号位0代表正数1代表负数。剩下的位数是这个数的绝对值的二进制。
比如 一个int变量大小为4字节在32位的编译器中的二进制表示就是00000000 00000000 00000000 00000000 那么10 的原码就是00000000 00000000 00000000 00001010−10的原码就是 10000000 00000000 00000000 00001010
反码
正数的反码和其原码是一样的 负数的反码就是在其原码的基础上 符号位不变 其他位取反。
10的反码就是00000000 00000000 00000000 00001010 和原码一样−10的反码就是11111111 11111111 11111111 11110101
补码
正数的补码就是其原码 负数的补码就是在其反码的基础上1
10的补码就是00000000 00000000 00000000 00001010−10的补码就是 11111111 11111111 11111111 11111011
总结一下
计算机系统中数值一律用补码来表示因为补码可以使符号位和数值位统一处理同时可以使减法按照加法来处理。 二进制编码数值编码分为原码反码补码符号位均为0正1负。
原码 - 补码 数值位取反加1
补码 - 原码 对该补码的数值位继续 取反加1
补码 的绝对值称为真值正数的真值就是本身负数的真值是各位包括符号位取反加1即变成原码并把符号位取反.
介绍基本的位操作
^按位异或按位与 | :按位或 b - -b 各位包括符号位取反加1
用位操作实现加法运算
我们先不考虑进位在1位数的加法上如下 1. 110 2. 101 3. 011 4. 000 很明显上面几个表达式我们可以用异或进行统一 1. 1^10 2. 1^01 3. 0^11 4. 0^00 这样我们就完成了最基础的一位数的加法但是怎么计算二位以上的加法呢我们发现现在方法的问题在于不能够获取进位于是我们通过观察一位数的加法的式子发现只有两个数位都是1的时候才会有进位其他都不进位这不是和很像吗 我们通过把换成得到下式 1. 110 不进位 2. 101 不进位 3. 011 不进位 4. 000 进位 那么我们把所有位进行操作然后左移一位不就可以当作加数当前的进位吗 到这里我们就完整解决了二进制相加问题中对应位的相加和进位的问题 1. x^y 加法 2. (xy)1 进位操作 那么总结一下
定理1设ab为两个二进制数则aba^b(ab)1。
证明
a^b是不考虑进位时加法结果。当二进制位同时为1时才有进位因此 (ab)1是进位产生的值称为进位补偿。将两者相加便是完整加法结果。
定理2使用定理1可以实现只用位运算进行加法运算。
证明
利用定理1中的等式不停对自身进行迭代。每迭代一次进位补偿右边就多一位0因此最多需要加数二进制位长度次迭代进位补偿就变为0这时运算结束。
那么我们可以根据上面的定理得到实际的C代码如下
int add(int a, int b){int re a;while(b){int tmp a;a a^b;b (tmpb)1;re a;}return re;
}
用位操作实现减法
减法和加法原理相同减去一个数相当于加上这个数的相反数所以完全可以利用加法操作唯一需要做的就是求出被减数的相反数。 求相反数的方法每一位取反末位加一。 代码如下
int subtraction(int a, int b)
{b add(~b,1); // 求b的相反数return add(a, b);
}
用位操作实现乘法
二进制的乘法同十进制的乘法并无什么不一样对于a∗b每次只需要将a左移对应的位然后同上一次的结果相加即可 当b的对应位为1的时候对a左移一位相加即可 当b的对应位位0的时候对a左移一位但是不相加 注意到我们上面的操作都是不包括符号位的因此我们单独考虑符号位。 代码如下
int getSign(int n)
{unsigned count 0;//计算n的位数do{count;}while(n count)//得到n的最左边的位return n (count-1);
}int mul(int a, int b){bool isNegative false;if(getSign(a) ^ getSigned(b))isNegative true;if(a 0) a add(~a,1);//求出a的绝对值if(b 0) b add(~b,1);//求出b的绝对值int res 0;while(b){ //当b不为0继续循环if(b 1) //当b当前位为1 才需要加ares add(res,a);a a 1;b b 1;}if(isNegative)add(~res,1);return res;
}
二进制除法
同乘法一样除法一样可以用减法来代替当a≥b才可以上商在每次上一个商也就是商值加1之后aa−b 代码如下
int divide(int a, int b){if(!b)throw std::runtime_error(Divided cant be zero...);bool isNegative false;bool isNegtive false;if(getSign(a) ^ getSign(b))isNegtive true;if(a 0) a add(~a,1);//求出a的绝对值if(b 0) b add(~b,1);//求出b的绝对值int res 0;while(a b){res add(res,1);a subtraction(a,b);}if(isNegative)add(~res,1);return res;
} --------------------- 作者harry_128 来源CSDN 原文https://blog.csdn.net/harry_128/article/details/80150502 版权声明本文为作者原创文章转载请附上博文链接 内容解析ByCSDN,CNBLOG博客文章一键转载插件
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916663.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!