使用位操作符实现加减乘除!

news2025/1/5 8:23:18

欢迎拜访:雾里看山-CSDN博客
本篇主题:使用位操作符实现加减乘除
发布时间:2025.1.1
隶属专栏:C语言

在这里插入图片描述

目录

  • 位操作实现加法运算(+)
    • 原理
    • 代码示例
  • 位操作实现减法运算(-)
    • 原理
    • 代码示例
  • 位操作实现乘法运算(*)
    • 原理
    • 代码示例
  • 位操作实现除法运算(/)
    • 原理
    • 代码示例
  • 简单的测试代码
  • 特别注意

以下是在C语言中通过位运算来模拟实现加减乘除运算的详细描述及代码示例:

位操作实现加法运算(+)

原理

利用位运算实现加法的基本思路来源于计算机中二进制数加法的过程,即通过逐位相加以及考虑进位来得到结果。可以使用异或( ^ )操作来模拟无进位的相加,用与( & )操作和左移( << )操作来模拟进位的产生,然后不断重复这个过程直到没有进位为止。

代码示例

int add(int a, int b) {
    int sum, carry;
    do {
        sum = a ^ b;  // 异或操作,模拟无进位相加
        carry = (a & b) << 1;  // 与操作获取进位,并左移一位
        a = sum;
        b = carry;
    } while (carry!= 0);
    return sum;
}

利用位运算模拟加法的过程,通过不断计算进位并进行无进位加法(异或操作)来实现整数相加。对于有符号整数,其位表示在计算机中是按照补码形式存储的,这种方法同样适用于补码表示的正负数相加。
循环直到进位为0,表示没有新的进位产生,此时的 a 就是相加后的结果。

位操作实现减法运算(-)

原理

减法可以转换为加法来实现,因为在计算机中,减去一个数等同于加上这个数的补码。求补码的方式是对原数按位取反后加1,在代码中可以先对减数取反(通过按位取反操作 ~ )然后再加1(可以调用上面实现的加法函数),最后与被减数进行加法操作即可实现减法。

代码示例

int subtract(int a, int b) {
    return add(a, add(~b, 1));  // a + (-b),先求b的补码(~b + 1),再与a相加
}

在计算机中,减去一个数等同于加上这个数的相反数。对于有符号整数,先通过按位取反操作 ~ 获取一个数补码表示下的“反码”,然后再加1就得到其相反数的补码表示,最后调用前面实现的加法函数来完成减法运算。

位操作实现乘法运算(*)

原理

乘法运算可以通过多次加法来模拟实现。例如,计算 a * b ,如果 b 的二进制表示中某一位为1,就把对应的 a 左移相应的位数后累加到结果中。通过循环检查 b 的每一位来完成这个过程。

代码示例

int multiply(int a, int b) {
    int result = 0;
    int sign = ((a < 0) ^ (b < 0))? -1 : 1;  // 判断结果的符号,异或运算确定正负情况
    a = (a < 0)? -a : a;  // 取绝对值
    b = (b < 0)? -b : b;
    while (b > 0) {
        if (b & 1) {  // 判断b的最低位是否为1
            result = add(result, a);
        }
        a = a << 1;  // a左移一位相当于乘以2
        b = b >> 1;  // b右移一位相当于除以2
    }
    return sign * result;  // 根据符号返回最终结果
}

首先确定结果的符号,通过判断两个操作数的正负情况,利用异或运算,如果两数正负不同则结果为负,相同则结果为正。
然后将两个操作数都取绝对值进行后续计算。乘法运算通过不断判断乘数( b )的最低位是否为1,如果是1就把被乘数( a )累加到结果中,之后 a 左移一位(相当于乘以2), b 右移一位(相当于除以2),重复这个过程直到 b 变为0。
最后根据之前确定的符号来返回正确的乘积结果。

位操作实现除法运算(/)

原理

除法运算可以通过不断地用被除数减去除数(利用前面实现的减法操作),并记录减法操作执行的次数来模拟实现。同时,为了处理符号以及提高效率,需要考虑一些边界情况和优化技巧,比如先判断被除数和除数的绝对值大小等情况。

代码示例

int divide(int dividend, int divisor) {
    if (divisor == 0) {  // 除数不能为0
        return -1;  // 可以根据实际情况返回合适的错误码或进行异常处理
    }
    int sign = ((dividend < 0) ^ (divisor < 0))? -1 : 1;  // 确定结果的符号
    int abs_dividend = (dividend < 0)? add(~dividend, 1) : dividend;  // 取被除数绝对值
    int abs_divisor = (divisor < 0)? add(~divisor, 1) : divisor;  // 取除数绝对值
    int quotient = 0;
    while (abs_dividend >= abs_divisor) {
        abs_dividend = subtract(abs_dividend, abs_divisor);
        quotient = add(quotient, 1);
    }
    return sign * quotient;
}

同样先确定结果的符号,然后把被除数和除数都取绝对值进行运算。
通过一个外层 while 循环,只要被除数大于等于除数,就尝试找到能从被除数中减去的除数的最大倍数。内层 while 循环不断左移除数,同时对应的倍数也不断左移(相当于乘以2),找到最大倍数后,从被除数中减去这个倍数对应的除数,同时把倍数累加到商中。
最后根据确定的符号返回正确的商。

简单的测试代码

以下是一个简单的测试主函数示例:

#include <stdio.h>

int main() {
    int a = 5;
    int b = -3;
    printf("加法结果:%d\n", add(a, b));
    printf("减法结果:%d\n", subtract(a, b));
    printf("乘法结果:%d\n", multiply(a, b));
    printf("除法结果:%d\n", divide(a, b));
    return 0;
}

特别注意

需要注意的是,上述基于位运算模拟的四则运算代码示例只是简单的原理性实现,在实际应用中,可能需要更多的错误处理、边界情况考虑以及针对性能等方面进一步优化,实际应用中可能需要进一步完善代码来处理这些特殊情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的题库管理系统的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…

MATLAB条件判断(switch-case-otherwise-end型)

在条件判断时&#xff0c;遇到很多个条件&#xff0c;如果再用 i f − e l s e if-else if−else语句就显得很繁琐&#xff0c;所以我们可以用 s w i t c h switch switch来解决 结构&#xff1a; 判断对象可以为数字&#xff0c;也可以为字符 如图&#xff1a; 注意&#x…

windows文件夹自定义右键调用powershell完成7zip加密打包

准备powershell脚本 2. regedit的路径是&#xff1a;计算机\HKEY_CLASSES_ROOT\Directory\shell\&#xff0c;在此项目下新增子项目diy_command\command&#xff0c;command的数据值为powershell D:\windowsProjects\directory_diy.ps1 %1 效果&#xff0c;点击后进入和power…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程&#xff1a; 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程&#xff0c;包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程&#xff0c;带你从0开始&#xff0c;组装属于自己的自主无人机&#xff0c;并让…

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char &#xff08;属于整形家族&#xff09;类型 2. 位段的空间上是按照需要以4个字节&#xff08; 类型 int &#xff09;或者1个字节&#xff08; char &#xff09;的方式来开辟的。 3. 位段涉及…

【OceanBase】利用 OceanBase 向量检索能力构建文档智能问答小助手

文章目录 一、实验环境说明二、前期准备工作2.1 安装 Python 3.9 和 pip2.2 安装 Poetry2.3 安装并启动Docker(可选)2.4 安装 MySQL 客户端2.5 注册阿里云百炼账号并开通服务获取 API Key 三、构建智能问答小助手3.1 部署 OceanBase 集群3.1.1 方式一&#xff1a;使用 OBCloud …

http报头解析

http报文 http报文主要有两类是常见的&#xff0c;第一类是请求报文&#xff0c;第二类是响应报文&#xff0c;每个报头除了第一行&#xff0c;都是采用键值对进行传输数据&#xff0c;请求报文的第一行主要包括http方法&#xff08;GET&#xff0c;PUT&#xff0c; POST&#…

Lucene 漏洞历险记:修复损坏的索引异常

作者&#xff1a;来自 Elastic Benjamin Trent 有时&#xff0c;一行代码需要几天的时间才能写完。在这里&#xff0c;我们可以看到工程师在多日内调试代码以修复潜在的 Apache Lucene 索引损坏的痛苦。 做好准备 这篇博客与往常不同。它不是对新功能或教程的解释。这是关于花…

如何提升可视化大屏的用户体验?

一、什么是可视化大屏的用户体验 可视化大屏的用户体验是指用户在使用大屏幕可视化系统时所感受到的整体体验。这包括系统的易用性、交互性、视觉效果、信息展示方式等方面。一个好的可视化大屏用户体验应该能够让用户轻松地获取所需的信息&#xff0c;快速理解数据&#xff0…

overscroll-behavior-解决H5在ios上过度滚动的默认行为

1. 问题 开发H5的过程中&#xff0c;经常会有android和ios两边系统需要兼容的情况。在ios上一直有个问题是当H5内容触及到页面顶部或底部时&#xff0c;还是可以被人为的往下或往下拉动界面。当然可能有的情况是比较适用的&#xff0c;比如你往下拉动&#xff0c;然后在导航栏…

【无线传感网】无线传感器网络拓扑控制技术

文章目录 拓扑控制的意义影响整个网络的生存时间减小节点间通信干扰&#xff0c;提高网络通信效率为路由协议、时间同步提供基础影响数据融合弥补节点失效的影响 拓扑控制的设计目标能量消耗覆盖度连通性算法的分布式程度网络延迟&#x1f6a9;干扰和竞争对称性鲁棒性和可扩展性…

使用pandas把数据库中的数据转成csv文件

使用pandas把数据库中的数据转成csv文件 1、效果图 2、流程 1、连接数据库,获取数据 2、把一些中文字符转成gbk,忽略掉无法转化的 3、把数据转成csv 3、代码 import pymysql import pandas as pddef get_database(databasename):

点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成 已锁定(升级版)

文章目录 1、updateInviteCodeStatus2、handleLock3、InviteCodeController4、InviteCodeService5、CrudRepository 点击锁定按钮&#xff0c;锁定按钮要变成解锁按钮&#xff0c;然后状态要从待绑定变成 已锁定&#xff1a;https://blog.csdn.net/m0_65152767/article/details…

活动报名系统源码:JAVA同城服务系统活动报名同城圈子商家商城城市代理躲猫猫

JAVA同城服务系统&#xff1a;打造多元化社交与娱乐新体验 在数字化时代&#xff0c;同城服务系统已成为连接城市生活的重要桥梁。我们精心打造的JAVA同城服务系统&#xff0c;不仅融合了活动报名、同城圈子、商家商城、城市代理等多重功能&#xff0c;还特别加入了创新的“躲…

【大模型实战篇】LLaMA Factory微调ChatGLM-4-9B模型

1. 背景介绍 虽然现在大模型微调的文章很多&#xff0c;但纸上得来终觉浅&#xff0c;大模型微调的体感还是需要自己亲自上手实操过&#xff0c;才能有一些自己的感悟和直觉。这次我们选择使用llama_factory来微调chatglm-4-9B大模型。 之前微调我们是用两块3090GPU显卡&…

数势科技:解锁数据分析 Agent 的智能密码(14/30)

一、数势科技引领数据分析变革 在当今数字化浪潮中&#xff0c;数据已然成为企业的核心资产&#xff0c;而数据分析则是挖掘这一资产价值的关键钥匙。数势科技&#xff0c;作为数据智能领域的领军者&#xff0c;以其前沿的技术与创新的产品&#xff0c;为企业开启了高效数据分析…

[卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析

目录 [卫星遥感] 解密卫星目标跟踪&#xff1a;挑战与突破的深度剖析 1. 卫星目标跟踪的核心挑战 1.1 目标的高速与不确定性 1.2 卫星传感器的局限性 1.3 数据处理与融合问题 1.4 大尺度与实时性要求 2. 当前卫星目标跟踪的主流技术 2.1 卡尔曼滤波&#xff08;Kalman …

骑行解压:身心的奇妙之旅,VELO Angel Revo坐垫

在快节奏的都市生活中&#xff0c;骑行不仅是一种健康的生活方式&#xff0c;更是一种心灵的释放。从心理生理学的角度来看&#xff0c;骑行能够促使身体分泌内啡肽&#xff0c;带来愉悦感&#xff0c;同时&#xff0c;它还能转移注意力&#xff0c;缓解焦虑。在这场身心的奇妙…

Agent系列:AppAgent v2-屏幕智能Agent(详解版)

引言 简介 方法 Agent 框架 Agent 交互 探索阶段 部署阶段 文档生成 高级功能 实验结果 总结 局限性 未来工作 1. 引言 大语言模型&#xff08;LLM&#xff09;如 ChatGPT 和 GPT-4 显著提升了自然语言处理能力&#xff0c;并且推动了智能体在自主决策中的应用。…

高等数学学习笔记 ☞ 无穷小与无穷大

1. 无穷小 1. 定义&#xff1a;若函数当或时的极限为零&#xff0c;那么称函数是当或时的无穷小。 备注&#xff1a; ①&#xff1a;无穷小描述的是自变量的变化过程中&#xff0c;函数值的变化趋势&#xff0c;绝不能认为无穷小是一个很小很小的数。 ②&#xff1a;说无穷小时…