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

不使用加减乘除对两个整数求和 阅读详情

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

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

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

 

上一篇《位操作基础篇之位操作全面总结》(http://blog.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/morewindows/article/details/8710737
//By MoreWindows( http://blog.youkuaiyun.com/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.youkuaiyun.com/morewindows/article/details/8710737 -\n");
	printf(" - By MoreWindows( http://blog.youkuaiyun.com/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.youkuaiyun.com/morewindows/article/details/8710737转载请标明出处,谢谢。

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

 

【知识分享】什么是同轴传输线结构? 同轴传输线的几何形状由中心导体组,嵌在介电材料(Dielectric)中,并且,被连续的外导体所包围,也被称为屏蔽(Shield)。内外导体有相同的几何中心轴,因此得名同轴(Coaxial)。 阅读详情

相关推荐

新版本大疆智图4.5 永久许可摄影测量建模软件

大疆智图支持常见格式的成果输出,包括 TIFF 正射影像和高程模型、LAS 格式点云,以及 B3DM、OSGB、OBJ 等六种常用格式的三维模型,还包括 DXF 和 SHP 等格式的等高线。大疆智图 DJI Terra是领先的三维重建软件,提供先进的技术和简单的操作,一站式解决方案,从航线规划到数据的获取,以及模型重建、数据分析等都提供独一无二的支持,优化项目工程,提供自动化优势,获得更有效智能的决策和行动,最终用户可以获得理想的结果,减轻工作压力,提高作业效率。质量报告和剖面查看功能有助于分析点云质量。

qq_62821232的博客 6888

不用加减乘除实现两个数相加

剑指offer:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 两个数不能用死则运算,那怎么办呢?首先肯定要想到可以用什么来模拟加法的过程,也就是说对数字进行更加底层操作--位运算 我们以4+9为例; 首先来看看十进制的加法如何进行:4+9=13(进而可以用二进制来模拟) 第一步,计算个位的值,不算进位,个位是3; 第二步,计算进位,得到10,如果这一...

weixin_41521306的博客 915

华为2288H-V5服务器做raid的详细步骤

华为2288H-V5服务器做RAID

qq_50263172的博客 6万+

不用加减乘除实现两个数之和

def add(num1,num2): while num1&num2>0: tmp=num1^num2 num2=(num1&num2)<<1 num1=tmp return num1|num2 思路分解:     1.如果两个数的二级制逻辑与后为0,则可以世界利用或运算进行对...

weixin_30527423的博客 198

STM32F103多通道PWM输出避坑指南:TIM1_CH1异常输出的解决方案

本文深入解析STM32F103多通道PWM输出中的TIM1_CH1异常问题,提供从时钟配置到GPIO复用的系统化解决方案。通过黄金法则配置流程和高级调试技巧,帮助开发者快速定位并解决PWM输出不稳定、占空比异常等问题,同时拓展多定时器协同和互补PWM等高级应用场景。

weixin_29194817的博客 117

Windows 10/11 下用 Docker 一键部署 CVAT 标注工具(附 WSL2 配置指南)

本文详细指导如何在Windows 10/11系统上,通过配置WSL2和Docker Desktop,实现CVAT标注工具的一键部署。内容涵盖从环境准备、Docker安装、CVAT服务启动到性能优化与安全配置的全流程,为计算机视觉开发者提供稳定高效的本地标注平台解决方案。

weixin_28839601的博客 462

用Java实现不用加减乘除做加法操作

面试题1:不用加减乘除,求两个整数的和。 import java.util.Scanner; public class GetSum { /** * 不用加减乘除做加法; * 十进制中的18和7相加;可以分成这样三步来计算:一.无进位的各个位相加得18+7=15;二.18加7的进位是10 * 三.用一和二的结果相加15+10=25 * 对数字运算除了使用四则运算,

水到渠成,功到自然成 5743

使用 Prometheus 监控 Spring Boot 应用

本文介绍了使用SpringBoot+Prometheus+Grafana实现应用监控的方案。首先在SpringBoot项目中集成Micrometer和Actuator组件,通过配置暴露Prometheus监控端点。接着配置Prometheus采集应用指标数据,并通过Grafana可视化展示。具体步骤包括:1)SpringBoot集成Micrometer;2)配置Prometheus抓取应用指标;3)安装Grafana并导入SpringBoot监控模板;4)展示JVM和业务指标。该方案可以实现对SpringB

蔡定努 430

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

转自http://blog.youkuaiyun.com/morewindows/article/details/8710737 上一篇《位操作基础篇之位操作全面总结》(http://blog.youkuaiyun.com/morewindows/article/details/7354571)介绍了:       一. 位操作基础,用一张表描述位操作符的应用规则并详细解释。       二. 常用位操作小

zhizunwudi的专栏 918

向华为学习——IPD流程体系之IPD术语

《IPD体系核心概念与业务术语解析》摘要: IPD(集成产品开发)是一种以市场为导向的结构化产品开发管理模式,通过跨部门协作、异步开发、CBB(通用构建模块)和管道管理等手段,实现产品全生命周期高效管理。体系包含七大核心要素:跨部门团队(如IPMT决策层、PDT执行层)、结构化流程(分阶段评审)、端到端项目管理(WBS分级计划)、客户需求分析、投资组合优化及质量管控(TR技术评审)。各业务领域术语涵盖财务(NPV、IRR)、开发(需求分解、基线化)、制造(可制造性设计)、采购(Sourcing团队)及市场(

cdfunlove的博客 481

ABAP Secure Storage 在事务码 SM59 中的应用

系统管理人员在进行维护时,应关注相关日志信息,及时发现可能出现的安全异常,并针对不同安全等级的操作制定相应的备份与恢复策略,以降低潜在风险。该区域在设计上具备高度隔离性,仅允许经过授权的组件访问。保存后,系统会将密码存储在 Secure Storage 中,这种处理方式充分体现了 SAP 标准程序在安全设计上的考量。对于系统管理员而言,这种机制在日常维护与审计中提供了有力的支持,可以通过比对存储数据的哈希值或其他完整性校验手段,及时发现异常变动,保障系统长期稳定运行。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 670

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

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

weixin_43417960的博客 291

snmp MIB详解

每个 MIB 对象都由一个对象标识符(OID)和对象类型组成。OID 是一个由多个数字组成的路径(类似于 IP 地址),它标识了 MIB 中对象的层次结构。

dlz0836的博客 3719

不用加减乘除运算符计算两数之和及a=b*3

《两个常见位操作面试题不用加减乘除运算符计算两数之和及a=b*3》 地址:http://blog.youkuaiyun.com/morewindows/article/details/8710737转载请标明出处,谢谢。 欢迎关注微博:http://weibo.com/MoreWindows   上一篇《位操作基础篇之位操作全面总结》(http://blog.youkuaiyun.com/more

baoendemao的专栏 882

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java 加法不用_【Java】 剑指offer(65) 不用加减乘除做加法

本文参考自《剑指offer》一书,代码采用Java语言。题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。思路对数字做运算,除了四则运算外,只剩下位运算了。根据一般情况下的加法步骤,设计如下:1)不考虑进位对每一位相加:1加0,0加1都等于1,而0加0,1加1等于0,所以使用异或^操作;2)计算进位:只有1加1产生进位,所以采用位与&操作,再左移1位;3)将...

weixin_30878051的博客 199

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【leetcode九日】day1

1.两数之和 原题371 不让我用+我偏要 class Solution { public int getSum(int a, int b) { return a + b; } } 2.两数之和 递归(面试题17.01) 好了不闹了,思路: 使用&来判断都为1的,使用 << 1,来进一位。 1010 << 1 得到 10100 这个时候,我们漏了互斥的那些数据。使用^来计算,互斥的位 得到:101 这个时候,我们又到了下一次循环。 1010

屠一乐的博客 264

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

《LeetCode零基础指南》(第一讲) 函数

《LeetCode零基础指南》(第一讲) 函数 371. 两整数之和 难度中等591收藏分享切换为英文接收动态反馈 给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。 示例 1: 输入:a = 1, b = 2 输出:3 示例 2: 输入:a = 2, b = 3 输出:5 代码演示 class Solution { public: int getSum(int a, int b) { return a + b; } }; 面试题 17.0

weixin_51665718的博客 7365

JAVA 运算符

JAVA 运算符的相关

weixin_54778787的博客 227

《九日集训》(第一讲)函数

第一题 两数之和 一、题目 1、题目描述 给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和。 样例输入:a = 1, b = 2 样例输出:3 2、原题链接 LeetCode 371. 两整数之和 解题报告 1、代码详解 class Solution { public: int getSum(int a, int b) { return a+b; } }; 三、总结 新手能过就行啦! 第二题 不用加号的加法 一、题目 1、题

qq_46597384的博客 1819

操作符详解(C语言)—算数操作符,移位操作符,位操作符

一道小面试题:如何交换两个变量的值,不能使用第三个变量,即a=3,b=5,交换后a=5,b=3?

Ochazuke的博客 967

Java只使用位运算实现加减乘除

前言 接前面一篇博客,这又是某个公司的奇葩面试题(都说了到底是哪家公司才会出这种没营养的面试题)。不过吐槽归吐槽,这个题目还是有点学问的,比前面那个不使用比较运算符如何比较两个数的大小 强多了(但是还是能看出面试官是在存心刁难人)。 原题是“只给加法,如何实现减乘除”,我寻思着,既然减乘除都不给了,那就加大点难度,加法也别给了吧,今天就手动去实现加减乘除。这里只实现int类型的加减乘除。 ...

qq_36403693的博客 1488

C++运算符全解析:从优先级陷阱到重载实战,避开常见坑点

运算符是编程语言中用于执行计算和逻辑操作的基础符号,其核心在于定义数据间的运算规则。理解运算符的优先级、结合律以及求值顺序是编写正确程序的关键,这直接关系到代码的执行逻辑和最终结果。在C++这类强调性能与灵活性的语言中,运算符的价值不仅在于基础运算,更在于其底层控制能力和抽象表达能力。通过位运算符可以进行高效的标志位管理和底层数据处理,而运算符重载技术则允许自定义类型像内置类型一样工作,极大地提升了代码的可读性和复用性。本文聚焦于C++运算符的深度应用,结合**运算符重载**和**位运算符**等核心概念,系

weixin_30336061的博客 376
上一篇: 进程通信之三 父进程传参数与子进程返回值
下一篇: Windows界面编程第九篇 位图显示特效 交错效果
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值