我也要学C语言-第四章:数据的表示与位的操作

Posted on 2011-05-22 15:12  dodolook  阅读(4873)  评论(76编辑  收藏  举报

  大家好!我看到大家的留言很开心!大家说的dudu我搜寻了下,哦!原来dudu是这个博客的鼻祖啊!!!就像朋克中的雷蒙斯!!!嘿嘿!其实我现在学习呢!我不知道我以后会学什么!但是我决心把我不懂的计算机中对我来说最神奇的东西,我想要去搞清楚!其实我是从什么时候开始对计算机感兴趣的呢,就是一次偶然的经历!我当时在看一本杂志!里面有一篇文章叫“中国最美丽的黑客MM”。我对这个很好奇!因为我之前只是听说过黑客这个词!在新闻里,常常用来表示利用计算机,计算机网络技术进行犯罪的人!我当时对这个很讨厌啊!后来我搜寻了网络,居然,黑客这个词在早起是褒义的!所以我对“中国最美丽的黑客MM”很是崇拜!我后来加了她QQ!我想也业余学习学习!但是我在她的网站上没有看到很系统的学习方法,讲的东西都让我摸不着头!于是呢!我就买了大量的计算机书籍!只要是人们评价不错的,我基本上一本不差的买了!我在很多书上发现书名都好可爱啊!比如:C语言的科学与艺术,C++沉思录等好多好多名字都那么有艺术气息!然后在一篇名为“如何成为一名黑客”的文章中按照它的指引一步一步来学。我觉得呢,学习就是一种快乐!我希望大家看到我的学习笔记有错误的时候马上告诉我,然后我马上去修正自己的错误!关于python我现在想把C语言学得差不多了后,还有汇编,操作系统原理,编译原理这些基础知识差不多熟练后再进行PYTHON的学习,因为我发现学Python的时候我不知道解释器到底都做了些什么,心底始终没有底的感觉!!!我在计算机方面的理想是,我只想拥抱着天,我只想要瓶可乐,我只想敲着键盘输出自己的快乐!哈哈哈!

一:进制

  关于数值与编码的学习,刚开始一个小时真的一头雾水!由于本身我呢对数学不敏感(我是音乐学院毕业的!后来发现和基础数学关系不大啊!嘿嘿!),后来慢慢的有点点感觉了!为什么要有这个进制这个东西呢!因为这个世界上啊!好多好多的东西!这些东西在人们面前如果没有一个明确的标记,就无法很精确的描述它.比如!这是我昨天晚上做的一个梦“两个古代的人在一起比赛射箭!最后看谁射在箭靶上的箭数量多!过了好一会儿,两个人的箭靶上的箭都扎得密密麻麻了!于是两个人都说自己的箭多!然后就打起来了!后来!两个人都想了想,我们必须找一种符号来描述我们可能无限多的箭的数量,这样标记下来我们才知道谁赢了!就这样两个人琢磨着如何来标记啊!其中一个人说道,哈哈有了!你看我们都有10个手指头,我们就用手指头来标记吧!嗯!这个想法不错啊!然后1个人每拔1根箭就数1个手指头,然后手指头数完了就让另外1个人数1个手指头,也就是到10个箭的时候,就用另外一个人的1个手指头表示!这样1个人用手指头表示最低位,另外一个人用1个手指头表示最低位的左移一位!不一会儿他们谁赢了一下子就清楚了!”

  十进制 刚才呢那两个射箭的人用10个手指去标记了箭的数量!这个其实就是为什么人们常用十进制的原因(深入理解计算机系统上面学到的!嘿嘿!为什么要提一下出处,是因为好多的知识都是我每天看书学到的,所以和学习计算机时间的长度无关的!)然后呢!十进制有个很大的特点,就是一个十进制数都可以分解成各位数字和它所在位的权值的总和(权值这个词我理解了好一会啊!原来是这样的,一个十进制数最右边那位权值是1,然后往左依次是10,100,1000。。。因为那个梦里数剑每到10都进了1位)。就是这样:

3*1000+4*100+5*10+6*1=3456

所以呢,其他任何进制转化为十进制都非常的简单了!!!只要把握住位权就可以了!

  十进制转二进制其实呢,这个是用除2取余呢!一直除到0位置哦!但是要注意一个地方啊!就是最后的结果是从下往上看的哦!

  邪恶八进制 我当时搜寻关于黑客的讯息的时候,我发现了1个论坛叫“邪恶八进制”。我当时觉得这个名字好邪恶,好奇怪啊!现在我明白了,因为早起有些计算机是八进制的,为什么呢!因为二进制的数字都好长好长的!为了达到精简!但是为什么偏偏是八进制,十六进制呢,因为,八进制和十六进制都是二进制的倍数啊!例如,八进制数就是3位为一段的,每位分别转为八进制数就可以了,相应十六进制就是4位为一段。 

二:位操作

   位操作符呢一共有6种,分别是按位与,按位或,按位异或,取反,左移,右移。

      按位与(&):就是参加与运算的两方呢,都是1的时候,结果就是1呢,其他情况呢就结果就为0。

      按位与的基本作用:当我们知道按位与的特点以后,我们就可以实现一些有用的功能了:

              (1)实现清零:因为与运算的双方必须都为1的时候,结果才为1,所以,要使1个单元清零呢,就可以把它与0做与运算。例如:

#include<stdio.h>

int main(void)
{
int x =2002;
x
= x &0;

printf(
"%d\r\n", x);


return (0);
}

                (2)随意取位:同理,你如果想取其中的哪些位就用这个数与上1个自己构造的一个数,其中为1的位就全部取出来啦!

    按位或(|):这个就是指运算双方只要有1个为1,那么结果就为1.这样的话,按位或也可以用来做全位置1的操作,这个操作和上面的与相仿,所以我就不写代码了。

    按位异或(^): 这个呢就是参加运算的两个二进制位相同,结果就为0,反之,结果就为1.哈哈!这就不难看出,任何数和0异或了后,和没有异或一样啊!

#included<stdio.h>

int main(void)
{
int x =1992;
x
= x &0XFF; /*因为1个F代表一个四位全1的二进制数*/


printf("%d\r\n", x);


return (0);
}

真有趣!;而且还有个有趣的功能就是任何和1异或就是把自己给反转了!嘿嘿!;其他呢,还有个可以用到的地方,就是啊!写一个2个变量之间的值交换,可以用按位异或。这样就省去了一个中间变量啦!:

#included<stdio.h>

int main(void)
{
int a =1;
int b =2;

a
= a ^ b;
b
= b ^ a;
a
= a ^ b;


printf("已经交换了!");


return (0);
}

    取反(~): 取反呢就很简单了,就是它自己操作自己,0变1,1变0了呢;

    左移(<<):左移呢,就是全位往左边移动了,每移动一位就相当于乘以2呢,因为是二进制嘛!但是有个特别小心的地方啊!要是高位有1的时候,左移过多了,那个1就跑到“外面去了!!!”。

           右移(>>):这个呢就是说,每右移一位就相当于该数除以2。

  以上知识是今天上午学习的内容,有些地方随着学习的进行,肯定有需要自我理解上的修正,先休息会,继续努力啦!

  诶!为什么我上面的代码框超出了边界啊!我不知道怎么弄!