大一计算机的自学总结:位运算实现加减乘除

news2025/1/31 18:03:38

前言

位运算当然可以用来实现加减乘除。

一、加法

#include<bits/stdc++.h>
using namespace std;

int add(int a,int b)
{
	int ans=a;
	while(b!=0)
	{
		ans=a^b;
		b=(a&b)<<1;
		a=ans;
	}
	return ans;
}

int main()
{
	int a,b;
	cout<<"a,b:"<<endl;
	cin>>a>>b;
	
	cout<<add(a,b);
	
	return 0;
}

 加法的原理就是利用了异或运算的本质:无进位加法再加上进位信息所得。

先让ans=a,然后只要b不等于0,先取两数的异或,即无进位加法;之后取两数进位信息,若两数在相同数位上都为1,所以该位进位,就是a&b。然后为了将进位信息加到ans中,要将a&b的的结果左移一位,直到两数没有进位信息。

二、减法

#include<bits/stdc++.h>
using namespace std;

int add(int a,int b)
{
	int ans=a;
	while(b!=0)
	{
		ans=a^b;
		b=(a&b)<<1;
		a=ans;
	}
	return ans;
}

int neg(int n)
{
	return add(~n,1);
}

int sub(int a,int b)
{
	return add(a,neg(b));
}

int main()
{
	int a,b;
	cout<<"a,b:"<<endl;
	cin>>a>>b;
	
	cout<<sub(a,b);
	
	return 0;
}

 减法就很简单了,转化成a+(-b)即可,而-b就是~b+1。

三、乘法

#include<bits/stdc++.h>
using namespace std;

int add(int a,int b)
{
	int ans=a;
	while(b!=0)
	{
		ans=a^b;
		b=(a&b)<<1;
		a=ans;
	}
	return ans;
}

int mult(int a,int b)
{
	int ans=0;
	while(b!=0)
	{
		if((b&1)!=0)
		{
			ans=add(ans,a);
		}
		a<<=1;
		b>>=1;
	}
	return ans;
}

int main()
{
	int a,b;
	cout<<"a,b:"<<endl;
	cin>>a>>b;
	
	cout<<mult(a,b);
	
	return 0;
}

 乘法依旧借助了竖式运算的原理,只不过这里是按二进制数位进行的。

若b的最后一位是1,就让ans再加上一个a,之后,要将a左移1位,并且为了取b的下一个数位,要让b右移一位。

四、除法

#include<bits/stdc++.h>
using namespace std;

int add(int a,int b)
{
	int ans=a;
	while(b!=0)
	{
		ans=a^b;
		b=(a&b)<<1;
		a=ans;
	}
	return ans;
}

int neg(int n)
{
	return add(~n,1);
}

int sub(int a,int b)
{
	return add(a,neg(b));
}

int divide(int a,int b)
{
	int x=a<0?neg(a):a;
	int y=b<0?neg(b):b;
	int ans=0;
	for(int i=30;i>=0;i--)
	{
		if((x>>i)>=y)
		{
			ans|=(1<<i);
			x=sub(x,y<<i);
		}
	}
	return (a<0)^(b<0)?neg(ans):ans;
}

int main()
{
	int a,b;
	cout<<"a,b:"<<endl;
	cin>>a>>b;
	
	cout<<divide(a,b);
	
	return 0;
}

除法借助的原理是,例如280除以25,只保留商,可以将280转化成25*2^3+25*2^1+25*2^0。

首先先将负数转为正数,然后从第30位开始到第0位,若x右移i位比y大,即x还包含2^i个y,所以往ans的第i位里或进去一个1,之后让x减去2^i个y即可。最后这个判断很妙,只有a和b异号时才返回-ans。

总结

感觉位运算实现加减乘除在做题上没什么用,就当训练位运算了。()

END

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

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

相关文章

《LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

进程控制的学习

目录 1.进程创建 1.1 fork函数 1.2 fork函数返回值 1.3 写时拷贝 1.4 fork 常规用法 1.5 fork 调用失败的原因 2. 进程终止 2.1 进程退出场景 2.2 进程常见退出方法 2.2.1 从main 返回 2.2.2 echo $&#xff1f; 查看进程退出码 2.2.2.1 我们如何得到退出码代表的含…

Formality:时序变换(二)(不可读寄存器移除)

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一、引言 时序变换在Design Compiler的首次综合和增量综合中都可能发生&#xff0c;它们包括&#xff1a;时钟门控(Clock Gating)、寄存器合并(Register Merging)、…

前端实战:小程序搭建商品购物全流程

目录 项目概述 开发环境搭建 微信开发者工具下载与安装 项目创建流程 项目目录结构及各文件作用 商品展示页面开发 页面布局&#xff08;WXML 与 WXSS&#xff09; 数据获取与绑定&#xff08;JavaScript&#xff09; 加入购物车功能实现 购物车功能开发 购物车页面布…

Python中的函数(下)

函数返回值 返回单个值 函数可以通过 return 语句返回一个值。一旦执行到 return 语句&#xff0c;函数就会停止执行&#xff0c;并将指定的值返回给调用者。例如&#xff1a; 返回多个值 实际上&#xff0c;Python函数只能返回一个值&#xff0c;但可以通过返回一个元组来模…

探索AI(chatgpt、文心一言、kimi等)提示词的奥秘

大家好&#xff0c;我是老六哥&#xff0c;我正在共享使用AI提高工作效率的技巧。欢迎关注我&#xff0c;共同提高使用AI的技能&#xff0c;让AI成功你的个人助理。 "AI提示词究竟是什么&#xff1f;" 这是许多初学者在接触AI时的共同疑问。 "我阅读了大量关于…

Linux运维之Linux的安装和配置

目录 Linux的基本概念&#xff1a; 1.为什么要使用Linux&#xff1f; 2.什么是Linux&#xff1f; Linux的安装和配置&#xff1a; 1.下载Linux的虚拟机和镜像文件&#xff1a; 1.1下载虚拟机 1.2下载镜像文件 2.在虚拟机或者物理机中安装Linux操作系统 3.配置虚拟机的…

【深度分析】微软全球裁员计划不影响印度地区,将继续增加当地就业机会

当微软的裁员刀锋掠过全球办公室时&#xff0c;班加罗尔的键盘声却愈发密集——这场资本迁徙背后&#xff0c;藏着数字殖民时代最锋利的生存法则。 表面是跨国公司的区域战略调整&#xff0c;实则是全球人才市场的地壳运动。微软一边在硅谷裁撤年薪20万美金的高级工程师&#x…

联想Y7000+RTX4060+i7+Ubuntu22.04运行DeepSeek开源多模态大模型Janus-Pro-1B+本地部署

直接上手搓了&#xff1a; conda create -n myenv python3.10 -ygit clone https://github.com/deepseek-ai/Janus.gitcd Januspip install -e .pip install webencodings beautifulsoup4 tinycss2pip install -e .[gradio]pip install pexpect>4.3python demo/app_januspr…

【MQ】探索 Kafka

高性能 消息的顺序性、顺序写磁盘 零拷贝 RocketMQ内部主要是使用基于mmap实现的零拷贝&#xff0c;用来读写文件 减少cpu的拷贝次数和上下文切换次数&#xff0c;实现文件的高效读写操作 Kafka 零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Jav…

指针(C语言)从0到1掌握指针,为后续学习c++打下基础

目录 一&#xff0c;指针 二&#xff0c;内存地址和指针 1&#xff0c;什么是内存地址 2&#xff0c;指针在不同系统下所占内存 三&#xff0c;指针的声明和初始化以及类型 1,指针的声明 2,指针 的初始化 1&#xff0c; 初始化方式优点及适用场景 4,指针的声明初始化类型…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(九)(完结篇)

文章目录 一、成绩查询模块实现1、学生成绩查询功能实现1.1 页面设计1.2 前端页面实现1.3 后端功能实现2、成绩分段查询功能实现2.1 页面设计2.2 前端页面实现2.3 后端功能实现二、试卷练习模块实现三、我的分数模块实现1、 页面设计2、 前端页面实现3、 后端功能实现四、交流区…

AI DeepSeek-R1 Windos 10 环境搭建

1、安装&#xff1a; 下载 Python |Python.org CUDA Drivers for MAC Archive | NVIDIA pip 和virtualenv Download Ollama on Windows 如下图 2、下载模型 deepseek-r1 ollama run deepseek-r1 或者可以ollama run deepseek-r1:8b 或 3、安装一个可视化对话Chatbox 下载 …

【懒删除堆】力扣2349. 设计数字容器系统

设计一个数字容器系统&#xff0c;可以实现以下功能&#xff1a; 在系统中给定下标处 插入 或者 替换 一个数字。 返回 系统中给定数字的最小下标。 请你实现一个 NumberContainers 类&#xff1a; NumberContainers() 初始化数字容器系统。 void change(int index, int numb…

【Block总结】OutlookAttention注意力,捕捉细节和局部特征|即插即用

论文信息 标题: VOLO: Vision Outlooker for Visual Recognition作者: Li Yuan, Qibin Hou, Zihang Jiang, Jiashi Feng, Shuicheng Yan代码链接: https://github.com/sail-sg/volo论文链接: https://arxiv.org/pdf/2106.13112 创新点 前景注意力机制: VOLO引入了一种称为“…

有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

Vue 组件开发:构建高效可复用的前端界面要素

1 引言 在现代 Web 开发中,构建高效且可复用的前端界面要素是提升开发效率和用户体验的关键。Vue.js 作为一种轻量级且功能强大的前端框架,提供了丰富的工具和机制,帮助开发者快速构建高质量的应用程序。通过合理设计和封装 Vue 组件,我们可以实现组件的高效复用,提高开发…

Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

文章目录 Pre概述在编程中&#xff0c;外观模式是如何工作的&#xff1f;外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…

OpenAI Operator:AI Agent 大战的号角,从 “工具” 到 “助手” 的飞跃

想尝试不同的 AI 模型&#xff1f;不必到处寻找&#xff01;chatTools 为您集成了 o1、GPT4o、Claude 和 Gemini 等多种选择&#xff0c;一个平台解决您的所有 AI 需求。现在就来体验吧&#xff01; 各位 AI 爱好者们&#xff0c;今天我们来聊聊 OpenAI 的最新力作——Operator…

AI大模型开发原理篇-9:GPT模型的概念和基本结构

基本概念 生成式预训练模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型 是由 OpenAI 开发的基于 Transformer 架构的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;专门用于文本生成任务。它的设计理念在于通过大规模的预训练来学习语言模…