每日一题 No.20 a*b(位操作符)【正负数】
来源:互联网 发布:大白菜会计软件 编辑:程序博客网 时间:2024/06/05 22:30
本题要求:
昨天写了2个正数相乘,今天让我们来用位操作符写2个正负数相乘吧,给定2个数a,b,计算a*b
输入格式:
a b
输出格式:
a*b的值
输入样例:
155 -152
输出样例:
-23560
解题思路 :
负数乘法跟正数乘法运算一样。我们只需要把负数变成正数并且记录哪个是负数,最后根据这个二个数是否是负数的情况来判断r是否为负数。
代码 :
#include <iostream>using namespace std; int add(int a, int b) { if (b == 0) { return a; } int s = a ^ b; int c = (a & b) << 1; return add(s, c);}bool isFuShu(int a) { a >>= (sizeof(int) * 8 - 1); return (a & 1);}int multi(int a, int b){ bool za = false; bool zb = false; if (isFuShu(a)) { za = true; a = add(~a, 1); } if (isFuShu(b)) { zb = true; b = add(~b, 1); } int r = 0; while (b) { if(b & 1) { r = add(r,a); } a <<= 1; b >>= 1; } if (za != zb) { r = add(~r, 1); } return r;}int main() { int a, b; cin >> a >> b; cout << multi(a, b); return 0; }
0 0
- 每日一题 No.20 a*b(位操作符)【正负数】
- 每日一题 No.22 a/b(位操作符)【正负数】
- 每日一题 No.17 a+b(位操作符)
- 每日一题 No.18 a-b(位操作符)
- 每日一题 No.19 a*b(位操作符)【仅限正数】
- 每日一题 No.21 a/b(位操作符)【正整数】
- 超级大数A+B(万位正负全能)
- 每日一题 No.16 位操作符的学习与应用
- 【C语言 每日一题】SOJ 1000 A-B
- 位操作 A + B Problem
- 每日一题(4)—— (a ^ b << 2)
- 每日一算法 A^B Problem
- 每日一题A
- 每日一题A
- 每日一题A
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- eclipse的properties文件中文被转码解决方案
- opencv 的几种边界
- Intervals
- 两道面试题(英文版)
- 1062. Talent and Virtue (25)-PAT甲级
- 每日一题 No.20 a*b(位操作符)【正负数】
- nyoj-喷水装置(一)
- 华氏温度与摄氏温度转化(for循环)
- 最小生成树
- 蓝桥杯-未名湖边的烦恼-递归-java
- 回归
- c语言里缓冲区的理解
- POJ 2976 (最大化平均值)
- 逆序输出