47 - 按位实现加减乘除 四则运算
2015-07-31 16:42
417 查看
不使用+-*/四则运算符,实现两个数的四则运算。
如 9+15=24
1001 + 1111,由于二进制 0+0=0,1+0=1, 0+1=1, 1+1=0, 可以发现是异或运算,而产生进位,则只有1 ,1相加,即与运算。
求 2 个正整数的乘积
乘的逆运算。
除法就是由乘法的过程逆推,x/y的过程: x依次减掉(如果x够减的)y^(2^31),y^(2^30),…y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。
参考:/article/1422750.html
1. 加
用二进制位实现两个数之间的加法。不考虑2个数相加的和溢出问题。如 9+15=24
1001 + 1111,由于二进制 0+0=0,1+0=1, 0+1=1, 1+1=0, 可以发现是异或运算,而产生进位,则只有1 ,1相加,即与运算。
int add(int nums1, int nums2) { if (nums1 == 0 || nums2 == 0) return (nums1 == 0) ? nums2 : nums1; int sum = 0, carry = 0; do { sum = nums1 ^ nums2; carry = (nums1 & nums2) << 1; // 进位左移一位 nums1 = sum; nums2 = carry; } while (nums2); return sum; }
2. 减
a-b = a + (-b),只需要实现负数操作,即求补码:按位取反 + 1int negtive(int num) { return add(~num, 1); } int sub(int nums1, int nums2) { return add(nums1, negtive(nums2)); }
3. 乘
如十进制中的乘法,逐位乘。求 2 个正整数的乘积
int multi(int nums1, int nums2) { if (nums1 == 0 || nums2 == 0) return 0; int result = 0; while (nums2) { if (nums2 & 0x01) { // 乘数的最后1位 result = add(result, nums1); } nums1 <<= 1; // 被乘数左移1位 nums2 >>= 1; // 取乘数的下一位 } return result; }
4. 除
求两个正整数相除的商。乘的逆运算。
除法就是由乘法的过程逆推,x/y的过程: x依次减掉(如果x够减的)y^(2^31),y^(2^30),…y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。
int division(int nums1, int nums2) { if (nums1 == 0 || nums2 == 0) return 0; const int BITS = sizeof(nums1)*8; int result = 0; for (int i = BITS-1; i >= 0; i--) { // 之所以不使用 nums2 << i 与 nums1 比较,是为了防止溢出 if ((nums1 >> i) > nums2) { result = add(result, 1 << i); nums1 = sub(nums1, nums2 << i); } } return result; }
参考:/article/1422750.html
相关文章推荐
- 关于java代码中的异常理解
- kuangbin带你飞 专题十二 基础DP1
- CSS3 抛物线 加入购物车
- SPOJ 2713. Can you answer these queries IV(GSS4 线段树)
- linux c/c++ GDB教程详解
- CI框架 数据库批量插入 insert_batch()
- POJ 2184 Cow Exhibition 01背包变型 好题
- java 对数字输出格式规范的函数 DecimalFormat
- 20150726 固定层效果实现
- 南阳47 过河问题(经典贪心)
- poj3635 Full Tank?(spfa+dp)
- Android Notification功能的实现
- Android UI 之 ExpandableListActivity、ExpandableListView
- 电子邮件
- [转] 深入剖析 linux GCC 4.4 的 STL string
- Selenium2学习-020-WebUI自动化实战实例-018-获取浏览器窗口位置大小
- 小韵游戏开发学习笔记——第五期:认识Unity基本组件(二)
- crontab
- 淘宝数据魔方技术架构解析
- Perl去掉数组中重复的行