两个常见位操作面试题 不用加减乘除运算符计算两数之和及a b 3

分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

《两个常见位操作面试题不用加减乘除运算符计算两数之和及a=b*3》

地址:http://blog.csdn.net/morewindows/article/details/8710737转载请标明出处,谢谢。

欢迎关注微博:http://weibo.com/MoreWindows

上一篇《位操作基础篇之位操作全面总结》(http://blog.csdn.net/morewindows/article/details/7354571)介绍了:

一. 位操作基础,用一张表描述位操作符的应用规则并详细解释。

二. 常用位操作小技巧,有判断奇偶、交换两数、变换符号、求绝对值。

三. 位操作与空间压缩,针对筛素数进行空间压缩。

四. 位操作的趣味应用,列举了位操作在高低位交换、二进制逆序、二进制中1的个数以及缺失的数字这4种趣味应用。

现在再来介绍两个位操作习题,这两个习题也常常在各大IT公司的笔试题面试题中出现。

1.不用加减乘除运算符计算两个数字之和

2.不用加减乘除运算符计算a = b * 3

首先这两个题目其实是很相关的,要计算

a = b * 3就是计算a = b *2 + b即a = b << 1 + b。

因此只要解决了不用加减乘除运算符计算两个数字之和,那么不用加减乘除运算符计算a = b * 3也就迎刃而解了。那么怎么不用加减乘除运算符计算两个数字之和了?我们知道在计算5 + 9时,首先不进位的话 5 + 9 = 4,5 + 9的进位为1,然后和就是1 * 10 + 4 = 14。同理放到二进制中也可以采用这样的方法。

运算步骤如下://By MoreWindows( http://blog.csdn.net/MoreWindows )

设有a = 3,b = 6。

a    0011

b    0110

不进位和 0101  = 5

进位         0010  = 2

因此 a + b就变成了5 + 2 << 1

然后有

5    0101

2<<1   0100

不进位和 0001  = 1

进位          0100  = 4

因此 a + b就变成了1 + 4 << 1

然后有

1    0001

4<<1   1000

不进位和 1001  = 9

进位          0000  = 0

当时进位为0时,不进位和为9即a + b之和。

代码不难写出:

//两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
//http://blog.csdn.net/morewindows/article/details/8710737
//By MoreWindows( http://blog.csdn.net/MoreWindows )
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int BitAdd(int a, int b)
{
	int nCarry = a & b;      // 进位
	int nSumNoCarry = a ^ b; // 非进位
	if (nCarry != 0)
		return BitAdd(nSumNoCarry, nCarry << 1);
	else
		return nSumNoCarry;
}
int BitMultiplication3(int a)
{
	return BitAdd(a << 1, a);
}
int main()
{
	printf("   两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3\n");
	printf(" - http://blog.csdn.net/morewindows/article/details/8710737 -\n");
	printf(" - By MoreWindows( http://blog.csdn.net/MoreWindows - \n\n");

	srand(time(NULL));
	const int MAXNUMBER = 100;
	int a = rand() % MAXNUMBER, b = rand() % MAXNUMBER;

	printf("\n      ------------------ 位操作之加法 --------------------\n");
	printf(" %d + %d = %d\n", a, b, BitAdd(a, b));

	printf("\n      ------------------- 位操作之a = b * 3 -------------------\n");
	printf(" %d * 3 = %d\n", a, BitMultiplication3(a));
	return 0;
}

运行结果如下所示:

《两个常见位操作面试题不用加减乘除运算符计算两数之和及a=b*3》

地址:http://blog.csdn.net/morewindows/article/details/8710737转载请标明出处,谢谢。

欢迎关注微博:http://weibo.com/MoreWindows

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

原文地址:https://www.cnblogs.com/heishanglaoyao/p/10488856.html

时间: 2024-08-06 02:02:25

两个常见位操作面试题 不用加减乘除运算符计算两数之和及a b 3的相关文章

不使用四则运算符计算两个整数的和

这里笔者只写出关键代码: int add(int n,intm) {   if(m==0) returnn;      ①    int sum=n^m;           ②    int carry=(n&m)<<1;    ③    return add(sum,carry); ④} 在分析每步代码之前先看两个例子:不带进位的两数相加:0000 0010------20000 0100------4结果是:0000 0110------6带进位的两数相加:0000 0101--

JAVA语法——不用乘法运算符计算2X16

package 不用乘法运算符实现2X16; import java.util.Scanner; public class 不用乘法运算符实现2X16 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入一个整数"); long number = scan.nextLong(); System.out.println("

C#中如何获得两个日期之间的天数差 ( c# 计算两个日期之间相差的天数 )

DateTime dtLast = new DateTime(Convert.ToInt32(LastMenses.Year), Convert.ToInt32(LastMenses.Month), Convert.ToInt32(LastMenses.Day)); DateTime dtThis = new DateTime(Convert.ToInt32(Year), Convert.ToInt32(thisMonth), Convert.ToInt32(Day)); int interva

剑指Offer面试题47(Java版):不用加减乘除做加法

题目:写一个函数,求两个整数之和,要求在函数体内不得适用+,-,* ,./  四则运算符号 面试的时候被问道这个问题,首先我们分析人们是如何进行十进制的加法的,比如是如何得出5+17=22的结果的,实际上,我们可以分三步进行:第一步只做各位相加不进位,此时相加的结果是12,第二步做进位,5+7中有进位,进位的值为10:第三步,把前面的两个结果加起来12+10的结果是22,刚好5+17=22 我们一直在想,求两个树之和四则运算都不能用,还能用什么?对数字做运算,除了四则运算之外,也就只剩下位运算了

不用【加减乘除】求两个整数之和

首先我们可以分析人们是如何做十进制的加法的,比如是如何得出5+17=22这个结果的.实际上,我们可以分成三步进行: 只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1): 做进位,5+7中有进位,进位的值是10;第三步把前面两个结果加起来,12+10的结果是22,刚好5+17=22. 我们一直在想,求两数之和四则运算都不能用,那还能用什么?对数字做运算,除了四则运算之外,也就只剩下位运算了.位运算是针对二进制的,我们就以二进制再来分析一下前面的三步走

部分常见ORACLE面试题以及SQL注意事项

一.表的创建: 一个通过单列外键联系起父表和子表的简单例子如下: CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id) ) CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) 建表时注意不要用关键字当表名或字段名,如insert

[转帖]2019年常见ElasticSearch 面试题解析(上)

2019年常见ElasticSearch 面试题解析(上) https://juejin.im/post/5e0348d8e51d45582512a59f 前言 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎.ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安

剑指Offer对答如流系列 - 不用加减乘除做加法

面试题65:不用加减乘除做加法 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 问题分析 我们之前详细探讨了位运算 剑指Offer对答如流系列 - 二进制中 1 的个数,已经非常非常详细了. 这道题仅仅是让做加法,我们除此之外还是做了乘除与减法. 记不清的朋友可以回头看看. 这里象征性地做一次解答吧 问题解答 public int add(int num1,int num2) { while(num2!=0){ int sum=num1^num2; in

65. 不用加减乘除做加法

面试题65. 不用加减乘除做加法 写一个函数,求两个整数之和,要求在函数体内不得使用 “+”.“-”.“*”.“/” 四则运算符号. 示例: 输入: a = 1, b = 1 输出: 2 提示: a, b 均可能是负数或 0 结果不会溢出 32 位整数 class Solution { public int add(int a, int b) { while(a != 0){ int tem = a ^ b; a = (a & b) << 1; b = tem; } return b;