本文目录一览:
c语言的加减乘除是怎么实现的
本质上都是位运算。 加法通过异或、且和左移递归实现。
设a,b为两个二进制数,则a+b = a^b + (ab)1;
典型的实现代码:
//递归版本的加法
int Add(int a, int b)
{
return b ? Add(a^b, (ab)1) : a;
}
//迭代版本
int Add_iter(int a, int b)
{
int ans;
while(b)
{
ans = a^b;
b = (ab)1;
a = ans;
}
return ans;
}
再用加法和移位就能模拟乘除和减法
减法:a-b = a+(-b)
乘法运算:原理上还是通过加法计算,将b个a相加。
除法运算:除法运算是乘法的逆。看a最多能减去多少个b
求两个按键控制数码管数字加减C语言程序
void main (void)
{
unsigned char num=0;
KEY_ADD=1; //按键输入端口电平置高
KEY_DEC=1;
while (1) //主循环
{
if(!KEY_ADD) //如果检测到低电平,说明按键按下
{
DelayMs(10); //延时去抖,一般10-20ms
if(!KEY_ADD) //再次确认按键是否按下,没有按下则退出
{
while(!KEY_ADD);//如果确认按下按键等待按键释放,没有释放则一直等待
{
if(num99) //加操作
num++;
}
}
}
if(!KEY_DEC) //如果检测到低电平,说明按键按下
{
DelayMs(10); //延时去抖,一般10-20ms
if(!KEY_DEC) //再次确认按键是否按下,没有按下则退出
{
while(!KEY_DEC);//如果确认按下按键等待按键释放,没有释放则一直等待
{
if(num0) //减操作
num--;
}
}
}
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
Display(0,8); //显示全部8位
//主循环中添加其他需要一直工作的程序
}
}
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;
for(i=0;iNum;i++)
{
DataPort=0; //清空数据,防止有交替重影
DUAN=1; //段锁存
DUAN=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位码
WEI=1; //位锁存
WEI=0;
DataPort=TempData[i]; //取显示数据,段码
DUAN=1; //段锁存
DUAN=0;
DelayMs(2); // 扫描间隙延时,时间太长会闪烁,太短会造成重影
}
望采纳
}
大一C语言编程问题
判断回文程序
char ch[6]="hello";
int b=0;
printf("请输入一个字符串");
char in[6];
gets(in);
for(int i=0;i=5/2;i++)
{
if(in[i]==ch[5-i]) //两个字符数组遍历并且头尾比较
b++; //记录相等的个数
}
if(b==5) //为5时属于hello整个颠倒写.
printf("输入的字符串是回文");
else
printf("输入的字符串不是回文");
查找字符串中字符的位置
int f(char *s, char *a)
{
int ls,la,i;
int flag = -1;
ls = strlen(s);
la = strlen(a);
if (la ls) return -1;//如果不存在 返回-1
for (i=0;i=ls-la;i++){
if (strncmp(s+i,a,la)==0) return i;
}
return flag;
}
第一道题没看明白
是加减交替吗?如果是,思路是这样的:
int sum = 1;
for(int i=3,i=20,i++)
{
if((i+1)%4 == 0)
{
sum = sum -i;
}
else
{
sum = sum + i;
}
}
return sum;
随手写的,只是思路,拼写也许会有小错误,上机如有bug还需你自己调试
初学见谅,这个加法计算器为何只能计算整数
int型数据:-1=(1000,0001B)原=(1111,1110B)反=(1111,1111B)补=(FFH)补。补码在计算机中进行的运算不同于一般的二进制数运算。他有自己的一套规则。比如加减法:[X+Y]补=[X]补+[Y]补;[X-Y]补=[X]补+[-Y]补,通过双高位识别法进行溢出判断。补码除法分恢复余数法和加减交替法。乘除法的运算相对于加减法复杂。
C语言中数的运算也有其自己的一套规则,简单的数是int-float;short-long;的方向转变。当整型数和整型数运算时得到的一定是个整型数;整型和浮点型数运算现将整型转化为浮点型数再运算的到的是一个浮点数,若将改浮点数赋值给整型数将会进行强制类型转换。去掉小数部分而不是四舍五入。
比如:比较下列两个结果:
#include "stdio.h"
mian()
{int n;
float m,a,b;
printf("please input two num(a/b).example:100,200");
scanf("%f,%f",a,b);
printf(" fist result:%d\n second result:%f\n",n=a/b,m=a/b);
}
输入:-1,2
得到结果:
fist result:0
second result:-0.5000000