C/C++基础-原码/反码/补码/位操作实现四则运算
来源:互联网 发布:ucloud 阿里云 腾讯云 编辑:程序博客网 时间:2024/06/05 15:10
序言
上次文章提到算术移位和逻辑移位的区别,这里学习如何用位操作实现四则运算。
1. 原码、反码和补码
[1] 原码
第一位表示符号,其余位表示值。
注意:不同类型符号数表示范围不同
8:00001000-8:10001000
8位二进制符号数的取值范围[11111111, 01111111]即[-127,127]
[2] 反码
正数的反码就是其本身
负数的反码:符号位不变,其余各位取反
[+1] = [00000001]原 = [00000001]反[-1] = [10000001]原 = [11111110]反
[3] 补码
正数的补码就是其本身
负数的补码:符号位不变,其余位取反,再+1 (反码+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补[-1] = [10000001]原 = [11111110]反 = [11111111]补
2. 常见的位操作
判断奇偶
- 最末位:为1为奇数,为0为偶数
奇数:a & 1 == 1偶数:a & 1 == 0
n & (n - 1)
[1] 判断一个数是否是2的幂次
[2] 求一个(正)数二进制中1的个数
if (n & (n - 1) == 0) printf("2的幂次或0");
while (n > 0){ count++; n = n & (n - 1);}
相反数
- 一个数的相反数 = 取反再加1,原理:http://www.xuebuyuan.com/1832853.html
- n = ~n + 1 = ~(n - 1)
- 获取整数最右边的1
n & (-n)也即: n & ~(n - 1)
- 去除整数最右边的1
n & (n - 1)
3. 四则运算
加法
- 异或操作:得到本位的加法结果
- 与操作:得到高位的进位值
int add(int a, int b){ int add, jin_wei; while (b != 0) //循环到没有进位退出 { add = a^b; jin_wei = (a & b) << 1; //得到高位的进位值 a = add; b = jin_wei; } return add;}
减法
- 减法容易转换为加法:a - b = a + (-b) = a + (~b + 1)
int subtract(int a, int b){ return add(a, add(~b, 1));}
(正整数)乘法
- 乘法:与十进制乘法类似,逐位乘的结果在不同位上相加
int multiply(int a, int b){ int ans = 0; while (b) { if (b & 1) ans = add(ans, a); a = a << 1; b = b >> 1; } return ans;}
除法
- 二进制除法竖式运算(正负数)
int divide(int a, int b){ bool neg = (a > 0)^(b > 0); if (a < 0) a = -a; if (b < 0) b = -b; if (a < b) return 0; int zuoyi; //zuoyi记录除数要左移的位数 for (zuoyi = 0; zuoyi < 32; zuoyi++) { if ((b << zuoyi) >= a) break; } //记录每次除法的商 int shang = 0; int i; for (i = 0; i < zuoyi; i++) { if ((b << i) > a) //确定商的位置,保证够除 continue; shang = shang | (1 << i); //新的商 a = a - (b << i); //新的除数 } if (neg) return -shang; return shang;}
- 正数除法
int divide(int a, int b){ int count = 0; while (a >= b) { a = substract(a, b); count++; } return count;}
参考文章:
http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
http://blog.csdn.net/u013074465/article/details/42680239(推荐)
http://www.cnblogs.com/wuchanming/p/4359341.html
2017.10.25
阅读全文
0 0
- C/C++基础-原码/反码/补码/位操作实现四则运算
- C 【原码 反码 补码】
- C语言之位运算/原码/反码/补码
- c语言的原码补码反码-位运算
- C语言基础之《原码,反码,补码》
- C语言基础-----进制转换,原码反码补码
- (C基础)字节,原码,反码,补码
- c语言基础系列-原码 反码 补码10
- C语言基础 原码 反码 补码 移码简介
- 【C语言程序设计】原码、反码、补码详解
- C 语言 - 整型 原码,反码,补码
- C语言原码、反码、补码
- C语言(四):原码、反码、补码
- 原码反码补码基础
- 原码反码补码基础
- [基础]原码反码补码
- 计算机中的位操作、补码、反码、原码
- 原码、反码、补码,以及负数的位操作
- UnityShader——球谐光照
- Android零基础入门第83节:Activity间数据传递方法汇总
- nrf52832 DUF功能加看门狗
- [Linux]zip文件解压乱码问题解决
- runLoop的运用
- C/C++基础-原码/反码/补码/位操作实现四则运算
- python_网络爬虫篇1
- method方法
- Git相关操作一
- Android Studio导入项目的中文注释乱码解决方法
- vue学习第7天,组件
- 轻松搞定多Offer选择
- 我们怎么过一天,就怎么过一生
- DynamicMethodInvocation值