47 - 按位实现加减乘除 四则运算
来源:互联网 发布:顺德农商网上银行软件 编辑:程序博客网 时间:2024/06/06 12:42
不使用+-*/四则运算符,实现两个数的四则运算。
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),只需要实现负数操作,即求补码:按位取反 + 1
int 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;}
参考:http://blog.csdn.net/hackbuteer1/article/details/7390093
0 0
- 47 - 按位实现加减乘除 四则运算
- 位操作实现加减乘除四则运算
- 位操作实现加减乘除四则运算
- 位操作实现加减乘除四则运算
- 位操作实现加减乘除四则运算
- 位操作实现加减乘除四则运算
- 位运算实现加减乘除四则运算
- 用位运算实现四则运算之加减乘除 .
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除
- 使用位运算实现加减乘除四则运算
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除
- 用位运算实现四则运算之加减乘除
- 使用“位运算”实现“四则运算”之加减乘除
- 用位运算实现四则运算之加减乘除
- itoo3.1新开始,新起点......
- 求集合问题(并查集+筛选求素数/C++)
- 技术研发人员书籍推荐
- poj3635 Full Tank?(spfa+dp)
- CSS3 抛物线 加入购物车
- 47 - 按位实现加减乘除 四则运算
- Hduuoj1034【水题】
- linux apache2 tomcat7 mod_jk 整合
- 南阳47 过河问题(经典贪心)
- 关于iOS控件全局样式统一设定问题
- springmvc中@RequestMapping 和 controller 小结
- 牟家和:没有无耻的创业者,只有无耻的投机者
- SPOJ 2713. Can you answer these queries IV(GSS4 线段树)
- INI文件格式以及Java编码实现读取