位操作实现加减乘除

一、常见功能的位操作实现

1常用的等式-n = ~(n-1) = ~n+1

2获取整数n的二进制中最右边一个1n&(-n)或者n&~(n-1),如:n=010100,则-n=101100,n&(-n)=000100

3去掉整数n的二进制中最右边一个1:n&(n-1),如:n=010100,n-1=010011,n&(n-1)=010000

 

二、位操作实现加法

1、原理:主要思想是将加法的计算结果分解为两部分:第一是不考虑进位的运算结果,第二是进位,然后再将这两者相加,即得到结果。详细表述如下:

(1)不考虑进位的计算结果,以一位二进制数来表示:

1+1=0

1+0=1

0+1=1

0+0=0

这个过程可以用异或位运算符来表示,即:

1^1=0

1^0=1

0^1=1

0^0=0

则a^b表示不考虑进位的计算结果。

(2)进位,同样以一位二进制数表示:

0+0→不进位

0+1→不进位

1+0→不进位

1+1→进位,即相当于是10,将10加到不考虑进位的计算结果上,即可得到整个的计算结果,而可以用位运算的与操作和向左的移位操作即可模拟上述的是否进位:

0&0=0       (0&0)<<1=0

0&1=0       (0&1)<<1=0

1&0=0       (1&0)<<1=0

1&1=1       (1&1)<<1=10

如此,即将运算结果计算出来了。接下来,需要按照递归的方式将上述思想实现,主要原因是将运算结果分为不考虑进位的运算结果A和进位值B,则计算结果为A+B,但该运算可能还是会产生进位,故将A和B再次采用这种计算方法进行计算,直到进位部分为0,即表示上次加法计算没有进位,则上次加法计算的不考虑进位的运算结果,即为整个加法计算的结果。例子如下:

2、代码实现

1)不用递归:

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

2)递归实现:

int getSum(int a, int b)
{if (!b)return a;elsereturn getSum(a^b, (a&b) << 1);
}

三、位操作实现减法

减法化为加法,即a-b=a+(-b)。代码实现:

int subtraction(int a, int b)
{return getSum(a,getSum(~b,1));
}


四、位操作实现乘法

unsigned int multiply(unsigned int a, unsigned int b)
{int i;int result;for (i = 0; i < 8 * sizeof(unsigned int); i++)//b是被乘数,a是乘数,判断a的二进制中为1的位所在的位置,让b左移相应的位置,然后相加if (a&(1 << i))result += b << i;return result;
}

五、位操作实现除法

int Pos_Div(int x, int y)//  x/y,代码得到结果的整数部分
{int ans = 0;for (int i = 8*sizeof(int)-1; i >= 0; i--){//比较x是否大于y的(1<<i)次方,避免将x与(y<<i)比较,因为不确定y的(1<<i)次方是否溢出  if ((x >> i) >= y){ans += (1 << i);x -= (y << i);}}return ans;
}

代码解释,考虑 8 / 3

     8    0000  1000

/    3    0000  0011

--------------------------

                         100

if ((x >> i) >= y)//这句代码可以反过来讲,(x >> i) >= y 等价于(x >> i)<<i >= y<<i,即 x>=y<<i,也就是说假如y<<i不溢出,y左移位数如果大于iy就大于x;

//y的左移<=>x的右移,y左移=>y不动,作为商的1左移相应位数,和y相乘的话,y也就左移相应位数了,此时商的最高不为0的位为1 << i。接下来剩余的数x -= (y << i)同样的操作。


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

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

相关文章

【随笔】About QWERTY

QWERTY键盘排布的最初目的是为了减慢人们的打字速度从而减缓对机器的压力&#xff0c;虽然随着时间的推移机器的处理能力越来越强&#xff0c;但是人们已然习惯了QWERTY键盘的打字习惯&#xff0c;所以QWERTY键盘布局被保留了下来。但是有一点奇怪的是QWERTY键盘被原封不动的照…

windows系统c++多线程开发

线程的一些基本概念 一、线程的基本概念。 基本概念&#xff1a;线程&#xff0c;即轻量级进程&#xff08;LWP:LightWeight Process&#xff09;&#xff0c;是程序执行流的最小单元。一个标准的线程由线程ID、当前指令指针&#xff08;PC&#xff09;&#xff0c;寄存器集合…

centos 下安装配置nfs服务器

1、环境centos5.6_x64iptables 关闭selinux 开启&#xff08;这个好像不影响&#xff09;服务端&#xff1a;192.168.10.150客户端&#xff1a;192.168.10.1522、安装yum install portmap //默认已安装yum install nfs-utils3、创建共享目录mkdir /nfsvim /etc/exports/nfs 19…

使用FTP获取RFC文档

连接FTP服务器主机&#xff1a; ftp FTP.RFC-EDITOR.ORG 21&#xff08;21是FTP中控制连接的端口号&#xff09;输入用户名&#xff1a;anonymous输入密码&#xff1a;namehost.domainRFC文档是放在in-notes/rfcxxxx.txt中的&#xff08;xxxx是RFC文档的编号&#xff09;&#…

XP系统安装SQL2000企业版开启1433端口

1.获得SQL2000安装包2.获得SQL2000.MSDE-KB884525-SP4-CHS.EXE/SQL2000-KB884525-SP4-X86-CHS.EXE补丁包微软官网有下载3.在SQL2000 的安装盘中找到MSDE这个目录&#xff0c;并且点击setup.exe安装&#xff0c;完成后重启。4.再次安装SQL2000客户端工具&#xff0c;完成后重启5…

GPU编程语言选择(OpenCL、CUDA 与C++ AMP)

1、CUDA、OpenCL与C AMP 其实在C AMP之前已经有了两个异构编程框架&#xff1a;CUDA与OpenCL。CUDA&#xff08;Compute Unified Device Architecture&#xff09;是显卡厂商Nvidia于2007年推出的业界第一款异构并行编程框架。在Nvidia的大力支持下&#xff0c;CUDA拥有良好的开…

初见 IsolatedStorage

IsolatedStorage 翻译过来是(隔离存储空间) 怎么理解呢,jake lin的故事讲得很好,可以拿过来借用一下 " 朝鲜人民精神文明都非常的发达, 因此上网时都不需要访问internet. 因此不可能访问我们的网络.也不能访问其他精神文明没有他们发达的国家的网络. 我们也不能访问朝鲜的…

单链表的头插法和尾插法实现代码(无头结点)

/*头指针,可以发现head是赋值为NULL&#xff0c;而不是head->next*/ //-----------------头插法------------------- node *head, *p; head NULL; while (……) {p (node *)malloc(……);p->data ……;p->next head;//此时第一个p的next指针是NULL&#xff0c;其后…

iptables的SNAT和DNAT应用

首先开启路由转发功能&#xff1a;# vim /etc/sysctl.confnet.ipv4.ip_forward 1# sysctl -p&#xff08;1&#xff09;SNAT&#xff1a;内网主机 --访问--> 外网服务器<1> 搭建模拟环境内网PC1&#xff1a;172.16.0.1/16&#xff08;Host-Only&#xff09;网关PC2&a…

[Winodows Phone 7控件详解]容器控件

在Windows Phone7中存在着多个容器控件&#xff0c;这些控件主要是用来界面的布局设置&#xff0c;以及包容多个控件时的布局设置。 一.Grid控件&#xff1a;主要用于界面的布局&#xff0c;这个和web page里的很相似&#xff0c;可以通过网格布置规划界面&#xff0c;也可以嵌…

C++ Template

引言 模板&#xff08;Template&#xff09;指C程序设计设计语言中采用类型作为参数的程序设计&#xff0c;支持通用程序设计。C 的标准库提供许多有用的函数大多结合了模板的观念&#xff0c;如STL以及IO Stream。 函数模板 在c入门中&#xff0c;很多人会接触swap(int&, …

《数据结构与算法分析》学习笔记(二)——算法分析

一、对算法分析方法的最简单的理解和使用方法 1、首先大家可能一般会被那些数学的概念搞晕&#xff0c;其实简单理解下来&#xff0c;就是假设任何语句执行的效率都是一样的&#xff0c;所以设定每一个语句的执行时间都是一个时间单位&#xff0c;那么只要计算这个程序到底执行…

Oracle--plsql异常处理

•什么是异常?Oracle中出现错误的情形通常分为编译时错误&#xff08;compile-timeerror&#xff09;和运行时错误(run-time error)&#xff0c;异常是在PL/SQL执行过程中出现的警告或错误。•异常是如何触发的?–发生了一个 Oracle 错误时–使用RAISE语句显式触发•如何处理…

再谈SQL Server中日志的的作用

简介 之前我已经写了一个关于SQL Server日志的简单系列文章。本篇文章会进一步挖掘日志背后的一些概念&#xff0c;原理以及作用。如果您没有看过我之前的文章&#xff0c;请参阅&#xff1a; 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事…

树的遍历和图的遍历的异同

一、认识的理清 1、 应该认识到“深度优先”和“广度优先”是算法思想&#xff0c;而递归是实现“深度优先”的一种方法&#xff08;深度优先可以非递归实现&#xff09;&#xff1b; 2、 深度优先搜索也叫深度优先遍历&#xff08;DFS&#xff0c;Depth_Fisrt_Search&#x…

VS2012和XE2013的关联和设置问题

1. 首先要正确安装Microsoft VisualStudio 2012 Intel Parallel Studio XE 2013&#xff0c;其中&#xff0c;先安装VS2012&#xff0c;再安装XE2013。 2.Microsoft Visual Studio 2012 Intel Parallel Studio XE 2013集成检验&#xff1a; 打开&#xff1a;开始所有程序-&…

语文成绩

题目背景 语文考试结束了&#xff0c;成绩还是一如既往地有问题。 题目描述 语文老师总是写错成绩&#xff0c;所以当她修改成绩的时候&#xff0c;总是累得不行。她总是要一遍遍地给某些同学增加分数&#xff0c;又要注意最低分是多少。你能帮帮她吗&#xff1f; //这又跟神器…

最小生成树和最短路径

一、概念的理清 1、图分为连通图和非连通图&#xff0c;我们一般讨论连通图。带权的图叫做网。 2、连通图的生成树&#xff1a;&#xff08;1&#xff09;包含图的所有的n个顶点&#xff1b;&#xff08;2&#xff09;只有n-1条边&#xff0c;且这n-1条边足以构成一棵树&…

推荐一款移动端的web UI控件 -- mobiscroll

用mobiscroll 可实现ios系统自带的选择器控件效果&#xff0c;支持几乎所有的移动平台(iOS, Android, BlackBerry, Windows Phone 8, Amazon Kindle)&#xff0c;当然在pc的浏览器上跑&#xff0c;效果也还不错。建议使用支持css3的浏览器访问^_^ 支持换肤&#xff0c;效果和性…

I2C通信 读写数据过程

在通信之初&#xff0c;主从机必须根据自己的要求约定好通信规则&#xff1a;command的定义和位置、address的位数和位置。 以读写从机寄存器数据为例&#xff1a; 假设从机寄存器地址为8位、从机寄存器也位8位&#xff08;被读取数据为8位&#xff09;&#xff1b; 约定读comm…