如何用布尔运算去模拟加减乘除?

fengyanan3375 2016-04-07 03:41:07
最近准备跳槽,看了一下360的一个面试题,将一个数不进行加减乘除扩大某个倍数(扩大七倍或者扩大九倍等),想想是不是通过布尔运算可模拟加减乘除,这样就可以不用加减乘除扩大倍数了,但是不知道思路,哪位大神提供一下?
...全文
617 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrankHB1989 2016-04-12
  • 打赏
  • 举报
回复
怎么现在这么多整得公务猿智商题一样的烂面试题……考点何在?strength reduction还是数字逻辑电路设计?
  • 打赏
  • 举报
回复
这里有一个方法 http://blog.csdn.net/fengyanan3375/article/details/51087332
chehw_1 2016-04-09
  • 打赏
  • 举报
回复



#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include <time.h>
#include <assert.h>

static uint64_t add(uint64_t a, uint64_t b)
{
	uint64_t sum, carry;
	do
	{
		sum = a ^ b;
		carry = (a & b) << 1;
		a = sum;
		b = carry;
	}while(b);
	return a;
}

static uint64_t mul(uint64_t num, uint64_t k)
{
	uint64_t result = 0;
	while(k)
	{
		if(k & 0x01) result = add(result, num);
		num <<= 1;
		k >>= 1;
	}
	return result;
}

int main(int argc, char **argv)
{	
	srand(time(NULL));
	
	uint64_t num = rand() % 10000;
	uint64_t k = rand() % 10000;
	
	// calc num * k
	uint64_t result = mul(num, k);
	uint64_t verify = num * k;
	assert(verify == result);
	
	printf("%" PRIu64 " x %" PRIu64 " = %" PRIu64 "\n", num, k, result);
	
	
	return 0;
}

lm_whales 2016-04-08
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
用与非门可以搭出任何逻辑电路。
他是用软件模拟的
赵4老师 2016-04-08
  • 打赏
  • 举报
回复
用与非门可以搭出任何逻辑电路。
  • 打赏
  • 举报
回复
忘说了,减法也可以用加法来实现。你去网上百度下,我记不大清了,以前学数字电子电路的时候做过。 除法器与乘法器也是类似的(但我忘了规则)
  • 打赏
  • 举报
回复
去玩“我的世界”吧,那里面你可以做各种门电路,牛B点还能做个全加器和数字乘法器出来。顺便给你个全加器的表达式(C-前一个运算的进位,A-加数,B-被加数,O-本位输出,C1-进位输出(对下一位计算来说,它就是C)) O=A^B^C C1=AB+(A^B)C 式中^表示异或运算(C++好像就是这个符号,但一般书面中是一个加号外有一个圆圈) 那两式子只是计算一位的,如果你的数是32位的无符号整数,就要循环32次。共需要33个位来存放结果(多一个位数) 乘法器就简单了,只要用移位相加就行了(这里有相加,题目又不准直接用加法,所以要先把加法器做出来),32位要移位32次,总共需要64个位来存放结果(多一倍位数。这是因为相加一次多一位,32次就多了32位)。 上面说的是无符号整数。符点数的原理也差不多,但是符点数因为实际上是两部分数据合起来的,所以要分别对这两部分计算,还要注意符点数特有的格式。不是很好搞。
lm_whales 2016-04-08
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
[quote=引用 7 楼 lm_whales 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] 用与非门可以搭出任何逻辑电路。
他是用软件模拟的[/quote] 因为“用与非门可以搭出任何逻辑电路” 所以“用布尔运算可以模拟加减乘除”[/quote]也对
赵4老师 2016-04-08
  • 打赏
  • 举报
回复
引用 7 楼 lm_whales 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] 用与非门可以搭出任何逻辑电路。
他是用软件模拟的[/quote] 因为“用与非门可以搭出任何逻辑电路” 所以“用布尔运算可以模拟加减乘除”
lm_whales 2016-04-07
  • 打赏
  • 举报
回复
这是要实现累加器的节凑 手工编写 累加器的加法,减法,乘法,除法 需要 1)<<.,>>,左右移位 2)&,|,~,^ (&,|,~ 足矣) 3)?: 或者if else ,或者 比较跳转 这些功能
lm_whales 2016-04-07
  • 打赏
  • 举报
回复
可以用 位运算 | 和 <<组合,实现倍数关系。 其实就是手动写二进制乘法 代码。
fefe82 2016-04-07
  • 打赏
  • 举报
回复
随便写的,没测过,加法 int a, b, c; int sum; ///// 赋值,初始化 ///// sum = a + b; c = a; do { sum = c ^ b; b = (c & b) << 1; c = sum; } while (b != 0)
cocoabird 2016-04-07
  • 打赏
  • 举报
回复
引用 1 楼 yuelengdihai 的回复:
左移啊 i<<7;
看错了
cocoabird 2016-04-07
  • 打赏
  • 举报
回复
左移啊 i<<7;

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧