🌸叶

F础一:清零与变换(编程菜鸟教学1)

文档

0.8

已售 0
196.46KB

数据标识:D17208139452295997

发布时间:2024/07/13

卖家暂未授权典枢平台对该文件进行数据验证,您可以向卖家

申请验证报告

数据描述

目录
Content
Chapter_1
Chapter_1
前两天看了 发了C语言基础教程,发现其实最基础的东西其实很好很好,所以今天开始教菜鸟们C编程
从简单到延伸,所谓延伸就涉及比较广泛,有C++,80X86,51,EDA,DSP等等,当然我们要从最简单的做起,
要求不高,只要懂一点点C语言的人都应该能看懂。
题外话:编程在研究上我看主要有两点第一点是算法问题,第二点是细心问题,我们不止有一种运算方法
,当然我们有很多种方法,没有最优的方法,但是努力后我们能想办法改进,这就使矛盾更小更小,在细
心上我们要考虑的很周到,方方面面每一个问题我们都要想相对的办法解决,只要天天坚持,我相信会有
一天你成为最棒的!还有要说的一点是今天我所说的小问题以后就是解决C延伸方面的大问题!问题很大
!伏笔先写在这,呵呵~
今天我们来看看清零与清零变换的一个小问题!
假如我们定义变量int t = 0;那么t的初始为0,以后呢?当然要看情况而定!当我们赋值后t的值就要变
化,比如做第一次循环我们可以写for(t;t<10;t++){;}当我们再做第二次循环呢?如果你还是写for
(t;t<10;t++){;}?这样对么?我们要对t进行从新赋值分配,否则当然行不通!
在我们遇到难解决的问题的时候,比如此时我们没办法直接对t进行赋值,那么我们有什么方法可以改变t
的值呢?倘若我们又不想让t变成0,而是变成其他呢?此时我们引入一个概念:位!
在数值中,任何一个有穷非极数都可以化成二进制形式,而二进制的每一个0或者1都可以表示一位,在常
见数学运算中,我们除了可以用 + - * / 我们还可以把数字进行简单的比较,比如进行 或 运算!下面
我们就来说说一个简单的例子:
#include
int main()
{
int a,b;
a=050;
b=0227;
a=a&b;
printf("a=%d\n",a);
getchar();
}
输出结果a = 0;
可以看出输出的值是0,不要被迷惑,因为 a != b 所以输出的是0,当然错误!这里我们看看a的二进制
数字a = 050(0XXX代表八进制) ,b = 0227 我们不难发现a的每一位与b都不相等
,那么计算机是不是按每一位进行 与 运算的呢?或者直接判断不相等呢?当然计算机没有直接判断的能
力,如果通过深入调试我们不难发现计算机再做加法的时候是按每一位运算的,这段深入CPU内部调试略
过!在本文中我们只做简单了解。
话说到这,我们当然试试,此时我们改变a的值与b的值,看看结果,比如我们做a+1,也就是a = 51,
#include
int main()
{
int a,b;
a=51;
b=227;
a=a&b;
printf("a=%d\n",a);
getchar();
}
输出结果a = 1;
我们不难发现现在的a的初始值是 a = 110011B, b = 11100011B,这两个的值只有一位相同,也就是第一
位都是1,这样的比较后我们发现在 a = a & b 运算后a的值是与b进行了按位运算。
这样我们也就打开了清零与变换问题,我们当然可以借助这样的手段进行a的变换,比如我们要时刻跟踪
一个值并要求时刻变换差都恒等于一个值的时候,我们也许不用去观察a的值变换,我们也可以通过另外
一个对比值的变换来记录下a的值。同时,我们也可以在适当的时候对a进行清零!当然这是一种方法!
既然说到清零问题,不妨我们再设置一个改位问题,可能大家都该猜到方法了吧,对了!就是应用或取反
的方法!话不多说,我们只举一个例子来说明一下:
#include
int main()
{
int c,d;
c=060;
d=017;
c=c|d;
printf("\nc=%o\n",c);
getchar();
}
输出结果c = 61;
我们在此就不做细说了,(在赋值时候前面加一个数字0代表八进制数字)c = 110000B, d = 1111B,按位进
行 或 运算后c = 111111B,这样我们就改变了c的后四位,当我们需要某一个值的时候,我们的方法不一
定非要赋值,当然赋值是最简单的方法,当然也可以借助某一个手段来进行篡改,好比 或 运算!
那么我们是否继续往下说呢?答案是当然,我们再来说说这个等待很久的反转问题,异或 运算!
异或无非是相等为0不等为1,我们这样就可以借助 异或 的手段来进行值翻转!举个例子:
#include
int main()
{
int x,y;
x=071;
y=052;
x=x^y;
printf("\nx=%o\n",x);
getchar();
}
输出结果 x = 023;
在此同上就不做详细介绍,x=0111001B,y=00101010B,异或后x的值为:00010011B 不同的位值都为1.
那么本文最后我们再讲讲有意思的一个问题,不知道有没有人算过这样的问题,这个问题我就留给大家自
己思考一下,研究后请大家顶贴回复我。问题很简单:把(100)在计算机中取反运算后的结果是多少?这个
我就告诉大家是(-101),为什么是(-101)呢?大家可以思考一下这个简单的问题!
最后这个有趣的问题就是取反问题,为什么说它十分有趣?我们仍然举个例子:
#include
int main()
{
int i;
i=025;
i=~i;
printf("\n取反后=%o\n",i);
getchar();
}
输出结果 i = 37777777752;(八进制)
有人说不可能吧,为什么是这么大的个数字?这个也不是不可能,我们来分析一下,初始值i = 10101B,
然后我们进行把i取反运算,结果是i = 11111111111111111111111111101010B,我们来对比一下,前面的i
只有5位,而后面取反后结果是32位,说到这儿这个大家就一下明白了,我的计算机是32位。当位数不足
的时候计算机统统填充0,也就是空,而按位取反后就都变成了1,也就是说这个 i 的初始值造成了这样
的后果,我们不是看 i = 10101B 而实际的 i 是 i = 00000000000000000000000000010101B!这样问题就
得以解决了!
在此希望大家深刻体会,更多精彩且听下回分解!!!
谢谢!本文完.
data icon
F础一:清零与变换(编程菜鸟教学1)
0.8
已售 0
196.46KB
申请报告