当前位置: 首页 > news >正文

龙岗营销网站建设创建软件网站

龙岗营销网站建设,创建软件网站,北京百度网讯科技有限公司,手机网站 jsp位运算算法篇#xff1a;位运算实现加减乘除 那么我们想必对加减乘除这些数学计算并不陌生#xff0c;但是对于我们的计算机来说#xff0c;由于机器只能识别二进制的语言#xff0c;那么我们底层的数据都是以二进制的形式存在#xff0c;那么我们CPU的计算器的加减乘除运…位运算算法篇位运算实现加减乘除 那么我们想必对加减乘除这些数学计算并不陌生但是对于我们的计算机来说由于机器只能识别二进制的语言那么我们底层的数据都是以二进制的形式存在那么我们CPU的计算器的加减乘除运算肯定都是通过位运算的方式来实现的那么本篇文章就是用位运算来实现我们的加减乘除运算那么废话不多说我们进入正文 1.加法运算 那么在我们的现实生活中我们熟悉我们十进制的加法运算运算规则就是对应的十进制位进行相加然后逢十进一进位到下一位上去而由于我们计算机的各种数据都是以二进制序列的形式存在所以我们的加法运算实际上就是要实现二进制的加法运算。 那么要实现二进制的加法运算的话我们首先得知道二进制加法运算的规则那么二进制加法运算的规则就是对应二进制位相加逢二进一那么这里我们只能通过我们的位运算来实现那么我们的位运算无非就是与或非以及异或运算等等那么我们怎么通过这些位运算来实现我们加法运算的一个逻辑呢。 其中异或运算我专门花了一片文章来讲解异或运算的原理以及应用那么我们知道异或运算的本质就是无进位相加那么对于实现我们二进制的加法运算那么我们可以采取这样的一个思路那么我们知道我们两个数进行异或运算就相当于两个数进行一个无进位相加的加法运算那么此时我们这里进行完一次异或运算我们相当于得到了每个对应二进制位相加的结果但是唯独每一个二进制位没有加上进位信息那么也就意味着只要我们将我们异或运算的结果得到的二进制序列的每一位再对应加上进位信息那么就是我们的正确结果。 那么这里的进位信息我们知道只有两个二进制位都为1那么会产生进位所以这里我们假设我们a和b两个数做加法运算那么我们要得到ab的进位信息的话我们可以a b那么与运算的规则是对应二进制位都为1结果才能为1只要有一个二进制位为0结果就为0那么我们ab的结果会得到一个二进制序列那么这个二进制序列的每一位的0和1就表示该二进制位相加如果有进位那么该二进制位就是1,反之为0,。 那么我们实现加法运算的最后关键一步就是刚才异或运算无进位相加的结果再异或上与运算的进位信息即可但是与运算得到的二进制序列中的0和1表示是该二进制位是否有进位但是实际要相加的话因为进位是要进到下一位所以我们就得将与运算的二进制序列给左移一位然后加上异或运算的序列。 那么可能有的读者就有疑问那么我们加完万一还会有进位怎么办比如假设是4个二进制位的两个数相加 10110001这里我们最低位会产生一个进位到第二位那么第二位加上我们的进位又会产生一个进位而我们刚才的思路的话我们将1011与0001先异或运算得到1010然后将1011与0001在与运算得到0001然后左移一位得到0010那么我们将刚才得到的异或运算的结果1010在与我们与运算右移的结果再进行异或1010 ^ 0010 1000,但是我们知道10110001的答案实际上是1100. 所以此时将我们的刚才计算的结果1000与之前的与运算右移的结果0010重新作为新的两个加数异或完后得再一次与运算一下确定运算的结果是否为0如果不为0说明还有进位那么就得在加上之前的进位信息所以重复之前的步骤先异或再与运算然后左移再异或 1000 ^ 0010 1010 (1000 0010)10000 1010 ^ 0000 1010 那么我们此时将我们的结果1010和0000重新作为加数但是我们如果得到进位信息为0也就是没有进位那么我们计算就结束那么这里就是我们代码设计循环的一个终止条件。 代码实现 #includeiostream using namespace std; int add(int a,int b) {while(b!0){aa^b;b(ab)1;}return a; } int main() {int a10,b30;coutabendl;int resadd(a,b);coutresendl; }2.减法运算 那么我们在位运算的第一篇就讲到过由于负数的补码专门进行了处理所以一个数减去一个数可以看成一个数加上该数的负数那么我们减法运算就可以应用我们加法运算的逻辑这里注意一个正数得到负数我们就取反加一即可 #includeiostream using namespace std; int add(int a,int b) {while(b!0){int carry(ab)1;aa^b;bcarry;}return a; } int main() {int a10,b30;couta-bendl;int resadd(a,(~b)1);coutresendl; }3.乘法运算 那么我们对于十进制的乘法运算我们十分熟悉那么可能对于二进制的乘法运算的话我们就显得稍微有点陌生那么我们二进制的乘法运算和我们十进制的乘法运算的运算规则是一样的也就是每一个二进制位来与另一个数相乘。 以四位二进制数为例 1001 0110 ———— ​ 0 1001 1001 ​ 0 ———— ​ 011 0 那么我们则如何实现我们乘法运算的这套逻辑呢那么我们知道我们乘法运算的话那么如果该二进制位是1那么则是另一个乘数本身反之如果是0那么则是0所以我们要现将这个乘数的每一个二进制位来判断所以得将其与1进行与运算判断该位置是0还是1然后将下一个要判断的二进制位移到最低位然后我们要将另一个乘数给左移同样的步数因为左移之后右边是用0来补所以我们左移完的结果在与之前的数相加即可 代码实现 #includeiostream using namespace std; int mulpitly(int a,int b) {int i0;int res0;while(a!0){int anta1;if(ant!0){res(bi);}i;aa1;}return res; } int main() {int a10,b30;couta*bendl;int resmulpitly(a,b);coutresendl; }4.除法运算 那么我们除法运算是我们加减乘除这4个运算中最难实现的一个运算其中难于实现的原因就是很多人它不知道我们二进制的除法的规则是什么那么你要问我是具体怎么实现我们的除法运算那么我的思路不是从我们除法本身的规则除法那么我们在实现除法运算之前我们前面已经有了我们的加法以及减法和乘法运算那么我们谁说一定就要按照二进制本身除法的运算规则去实现它我们可以转换为我们的乘法以及加法来实现我们的除法。 那么可能读者看到这还是内心里还是有点疑惑那么我接着将一步阐述我实现除法的一个原理 那么我们假设我们有两个不同的数比如a和b那么我们a与b做除法运算那么这里我们假设a是被除数b是除数并且a不是整除b的我们除法运算不就是要得到a/b的尚以及余数吗那么我们知道a/b会得到一个商和余数那么意味着我们a除以b我们可以写成ab*商余数 那么现在我们首先求这个商的值那么我们知道我们任何一个数本质上都是一个二进制序列那么同理我们的商本质也是一个由0和1组成的二进制序列那么我们假设我们的数是8个二进制位那么如果说我们的商是01000111那么我们知道我们ab*商余数那么我们可以将我们这个商根据它的二进制序列将我们的原式转换成这样的形式 a b ∗ ( 2 6 2 2 2 1 2 0 ) 余 数 ab*(2^62^22^12^0)余数 ab∗(26222120)余数 那么我们求这个商的值是多少我们知道我们的商本质是一个二进制序列那么我们求商实际上就是可以转换为确定商的二进制序列中哪些位置为1只要把所有二进制位为1的位置确定那么商的二进制序列我们就知道了那么商的值自然也就知道了那么我们确定我们二进制为1的位置 那么现在的思路就是怎么确定商的二进制序列的1会出现在哪些位置呢那么我的策略就是先依次确定该二进制序列最左侧的1出现的位置是哪里 假设被除数是a除数是b那么对于一个有符号整形的数来说最高位是符号位那么其余剩下是数值位那么对于一个int类型含有32个二进制位的数来说那么它的最高位就是第31位因为第32位是符号位那么我们就假设该二进制序列中最左侧的1在第31位那么直到我们a除以b得到商或者余数也就意味着除数b乘以商是一定等于或者小于我们的被除数的那么如果满足该位置是最左侧的1的话那么我们二进制序列的第31位为1的得到数比如c乘以我们的除数b它一定是小于等于我们的被除数a的那么如果不满足也就是说该二进制位为1的数乘以除数b大于了我们的被除数a那么我们知道该二进制位肯定不可能为1只能为0那么最左侧的1肯定不在第31位那么我们就依次右移讨论那么直到讨论到二进制位为1的该数c乘以b它小于等于我们的被除数a那么意味着该最左侧的二进制位为1的位置在该位置那么我们就记录然后我们在用被除数减去除数a乘以c然后这个数作为我们的被除数因为我们a/b可以写成: a b ∗ ( 2 6 2 2 2 1 2 0 ) 余 数 ab*(2^62^22^12^0)余数 ab∗(26222120)余数 也就是 a b ∗ 2 6 a ∗ 2 2 a ∗ 2 1 a ∗ 2 0 余 数 ab*2^6a*2^2a*2^1a*2^0余数 ab∗26a∗22a∗21a∗20余数 最后转换成 a − b ∗ 2 6 a ∗ 2 2 a ∗ 2 1 a ∗ 2 0 余 数 a-b*2^6a*2^2a*2^1a*2^0余数 a−b∗26a∗22a∗21a∗20余数 那么确定剩余的为1的二进制位那么重复刚才的思路直到最后被除数如果不为0那么该被除数就是余数。 代码实现 #includeiostream using namespace std; void chufa(int a,int b) {int res0;for(int i29;i0;i--){if(a0){break;}long long ant(long long)b*(1i);if(aant){res(1i);a-ant;}}bres;return; } int main() {int a280,b25;couta/bendl;chufa(a,b);coutb aendl;return 0; }
http://www.lakalapos1.cn/news/64584/

相关文章:

  • 汉口网站关键词排名外贸怎么做网站外链
  • 固安县城乡和住房建设局网站深圳市工程建设交易中心服务主页
  • 商标注册 网站建设如何入账凡科论坛网站制作
  • 传媒网站给行业做宣传网站打印模板制作
  • 福建泉州网站建设公司wordpress自定义文章类型如何调用
  • 自己做网站视频教学苏州网站设计公司哪家便宜
  • 网站首页网址37网游
  • 网站开发后台的问题泰州模板自助建站
  • 上海建设工程造价信息网福州seo兼职
  • 有什么做房屋装修的网站做灯笼手工简单做法
  • 上海网站建设免10种网络营销方式
  • 网站标题和关键词企业logo设计思路
  • 建设网站站点过程中三生团队网站找谁做的
  • 义乌做网站的电话学习电商运营去哪里学
  • 网站模板中文版云服务器防御
  • 德阳网站建设熊掌号汶上做网站
  • 利用js做网站海南做网站找谁
  • 网站建设公司广告语黑龙江建设厅网站官网
  • 武进建设银行网站首页dw2021网页设计教程
  • 趣闻网站如何做类似稿定设计的软件有哪些
  • 怀来县住房和城乡规划建设局网站宝塔wordpress打开卡顿
  • 用ps如何做模板下载网站东莞寮步二手房
  • 众创空间网站建设方案网站开站备案
  • 互联网站备案表seo培训多少钱
  • 网站维护客户如何免费制作小程序
  • 网站仿制 个人建设银行官方网站 诚聘英才
  • 苏州做网站企业企业征信查询官网入口
  • 站长平台怎么添加网站做网站的数据库的设计
  • 上海手机网站哪家最好上海贸易网站建设
  • 网站建设存在的具体问题wordpress制作数据可视化