C语言实现用位移运算符进行加减乘…
最近,在百度知道上回答问题,然后看见有的人问如何用位移运算符去进行加减乘除运算,于是巩固今天就在这总结一下。
= a^b,进位就是arr =
a&b,(与sum相加时先左移一位,因为这是进位)。完成加法直到进位为0.
a+(-b) 根据补码的特性,各位取反加1即可(注意得到的是相反数,不是该数的补码,因为符号位改变了)
num2)
if(num2==0) return num1;//没有进位的时候完成运算
int sum,carry;
sum=num1^num2;//完成第一步没有进位的加法运算
carry=(num1&num2)<<1;//完成第二步进位并且左移运算
return AddWithoutArithmetic(sum,carry);//进行递归,相加
其实这个还可以写得更简单,我们用的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。代码如下:
return b ? Add(a^b,(a&b)<<1) : a;
int ans;
while(b)
//直到没有进位
ans = a^b;
//不带进位加法
b = ((a&b)<<1);
//进位
a = ans;
return a;
//取补码
return Add(~a, 1);
return Add(a, negtive(b));
int ans = 0;
while(b)
if(b&1)
ans = Add(ans, a);
a = (a<<1);
b = (b>>1);
return ans;
int ans=0;
for(int i=31;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;
int ans;
while(b)
//直到没有进位
ans = a^b;
//不带进位加法
b = ((a&b)<<1);
//进位
a = ans;
return a;
//取补码
return Add(~a, 1);
return Add(a, negtive(b));
return (a&0xFFFF) && !(a&0x8000);
return a&0x8000;
return !(a&0xFFFF);
int ans = 0;
while(b)
if(b&1)
ans = Add(ans, a);
a = (a<<1);
b = (b>>1);
return ans;
if( iszero(a) || iszero(b) )
return 0;
if( ispos(a) && ispos(b) )
return Pos_Multiply(a, b);
if( isneg(a) )
if( isneg(b) )
{
return Pos_Multiply( negtive(a), negtive(b) );
}
return negtive( Pos_Multiply(
negtive(a), b ) );
return negtive( Pos_Multiply(a, negtive(b)) );
int ans=0;
for(int i=31;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;
if( iszero(b) )
cout << "Error"
<< endl;
exit(1);
if( iszero(a) )
return 0;
if( ispos(a) )
if( ispos(b) )
return Pos_Div(a, b);
return negtive( Pos_Div( a,
negtive(b)) );
if( ispos(b) )
return negtive( Pos_Div(
negtive(a), b ) );
return Pos_Div( negtive(a), negtive(b) );
int c = 1;
= (a^b);
if( iszero(b) )
return 0;
while( b >>= 1 )
c <<= 1;
return (c&a);
if( isneg(a) )
if( isneg(b) )
{
return isbig_pos( negtive(b), negtive(a) );
}
return 0;
if( isneg(b) )
return 1;
return isbig_pos(a, b);
C语言实现用位移运算符进行加减乘…的更多相关文章
- 搬运1:关于对C语言中数组名取地址加减等操作的一点探究
对于数组名取地址强制转换的操作 偶然在晚上学了C语言指针后网页闲逛找题时,被一个数组名取地址搞糊涂了,在自己试验加探索后我稍微悟了一点东西. 代码如下: #include<stdio.h> ...
- 大整数加减运算的C语言实现
目录 大整数加减运算的C语言实现 一. 问题提出 二. 代码实现 三. 效果验证 大整数加减运算的C语言实现 标签: 大整数加减 C 一. 问题提出 培训老师给出一个题目:用C语言实现一个大整数计算器 ...
- 2.2JAVA基础复习——JAVA语言的基础组成运算符和语句
JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...
- Swift语言指南(九)--基本运算符
原文:Swift语言指南(九)--基本运算符 运算符(operator)是用来检查,改变或合并值的一种特殊符号或短语.例如,加号运算符让两个数字相加(如:let i = 1 + 2),还有些更复杂的运 ...
- Java补码表和位移运算符
在java中数据都是以二进制的形式保存的. 但是我们看到的数据怎么是10进制的? 因为java展示之前会自动调用toString()方法 这里以4位2进制为例,4位2进制只能表示16个数,即0-15. ...
- c语言的类型、运算符与表达式
title: 2017-10-17c语言的类型.运算符与表达式 tags: c程序设计语言 grammar_cjkRuby: true --- 1.1 数据类型 char 字符型,一个字节 int 整 ...
- C语言入门教程-(6)运算符
1.运算符概述 运算符是一种编译器执行特定的数学或逻辑操作的符号.C语言提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 其他运算符 2.算术运算符 算术 ...
- Java 中位移运算符 >>,>>>,<<
Java 中的三种位移运算符 java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : ...
- 正经学C#_位移与其位移运算符[c#入门经典]
在c#入门经典一书中,最为糟糕的一节就是位移了,完全没有讲明白,也没有说全,似乎只是轻轻点了一下何为位移,带了两次原码和补码,完全不理会是否明白不明白.这一点这本书很差.因为此书说了,在大多数应用开发 ...
随机推荐
- JS在严格模式和非严格模式的区别
若想在严格模式下使用JS,需要在文件的第一行加上“use strict”,在实际开发中,常常将“use strict”加入到闭包的内部 具体是: 整个脚本中使用:在这个JavaScript文件开头写' ...
- 第二章 向量(f)归并排序
- Ubuntu 16.04下添加新用户
某些情况下,Ubuntu 使用useradd 新用户名,在home 文件夹下面看不到新创建的用户文件夹,例如:root@worker:/home/kuku# useradd spark root@ ...
- DRF的权限和频率
DRF的权限 权限组件源码 权限和频率以及版本认证都是在initial方法里初始化的 我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~ 在rest ...
- FormData的使用
var formData = new FormData(); <form id="coords" class="coords" onsubmit=&quo ...
- 【校招面试 之 网络】第2题 TCP的可靠传输、流量控制、滑动窗口
1.可靠传输 (1)三次握手 TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接: (1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_S ...
- Django具体操作(五)
一.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影 ...
- MVC学习(三)Code-First Demo
前面两篇文章介绍了DataBase-First例子,这里就介绍Code-First. 个人简单理解:就是在程序中编写代码,然后在数据库中生成相应的表.字段.约束等等.听上去蛮神奇的.Now,begin ...
- [BX]指令
mov ax,[bx] 功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中.即(ax)=((ds)*16+(bx)). mov [bx],ax 功能:b ...
- mysql定位慢查询
mysql定位慢查询 //显示数据库的状态 show status; //显示执行了多少次插入 show status like 'com_insert'; //显示执行了多少次更新 show sta ...