`

[转]C语言位运算学习

阅读更多

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1449611

C语言中提供给开发人员一种位的运算,这种位的运算常用在检测和控制领域中,这和c语言的特性关系非常大,因为c语言是具有高级语言的特点和低级语言的功能,能完成一些汇编语言所能完成的功能。给开发人员提供了一定的简便。


【运算符】位运算中有6中运算符【&,|,^,~,<<,>>】分别是按位与,按位或,按位异或,取反,左移,右移。
其中除了~,其他都是二目元,而且在运算中的运算量只能是整形或者是字符型,绝对不能有实型出现。
当然在运算中,所有的运算量都应该是binary.
下面分别来比较各种运算符:
【一】:按位与“&”,当二个运算量中相应的二进制位都为1的时候,则该位才是1,否则其他就是0;
           如果是负数参加运算,则应该是以补码的形式表示为二进制,然后再进行按位的与的运算;
           按位与的一些作用:
           1:清零       2:取一个数中的某些指定位       3 :保留某个数中的制定位

【二】:按位或“|”,当二个运算量中相应的二进制位为1的时候,则该位运算结果是1,否则其他就是0;
【三】:按位异或“^”,该运算也称XOR运算符,二个二进制位同号,该位运算的结果则是0,异号则为1;
    两个相应是否为“异”,为“异”就取值1,否则为假0;
           按位异或的一些作用:
    1:使特定的位翻转    2:与0相^,保留原值      3:交换两个值,不用临时变量
【四】: “取反”运算符,是一个单目元,用来对一个二进制数按位取反,对任何一个数应该先转化位二进制,再进行取反;这里值得一提的是取反的法则,就是将数据中的 某位中的1变成0,0变成1,但是应该注意一点是将C的source移植到32位存放一个整数的计算机系统上的过程。为了使移植性加强,我们可以取得某一 位时该数&&某数时,可以采用a=a&~1【举个例子】这种方法来取得最后一位。切记取反与正负号运算是不同的。
    ~运算符的优先级别比算术运算符,关系运算符,逻辑运算符和其他位运算符都高。
【五】: “左移运算符”,是指将一个数的各个二进位全部左移若干位,左移的过程中右边则补0,高位溢出舍弃不用。一般情况下【不包括左移高位溢出舍弃的数中不包含 1的情况】左移N位后,使该数变成原来数的2的n次方倍。对于左移舍弃位中包含1的情况下,日后查询资料后再做研究:)
【六】:“右移运算符”, 与左移运算相反,右移使原来的数缩小到原来数的2的n次方。但是应该注意右移的过程中要注意符号位的问题。对于无符号数,右移时左边高位移入0,对于有符 号的值,如果原来符号为0【正数】,则左边也是移入0,如果时1【负数】,左边移入1,还是0这个就要取决所用到的计算机系统,移入0时称为【逻辑右 移】,移入1时称为【算术右移】

最后对于不同长度的数据进行位运算的过程方法是:
系统一般都是采取右端对齐,例如:a&b,a位long,b为int,如果b为正数,左侧16位补满0,b为负数,左端应该补满1,b为无符号整数型,左侧填满0。

自 己的一些见解:在位运算过程中,或者用到位标识的时候,一般都是针对该数二进制数的某一位进行运算,特别在通讯领域,系统本身就是要求缩减系统的大小。位 的使用就恰恰使这块得到广阔的使用空间。比如我们在一般的应用开发软件中,设置相应的”开关“,一般都是用布尔型或者使用一个short int型进行标识,但是在使用位的运算中,可以使用一个由几位组成的一个二进制数,由其中1位或者几位组成一个”开关“,所以说位的使用对于系统大小有严 格要求的有一定的优势。




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics