位运算

运算符的分类:

&: 叫做按位与运算符 
|:叫做按位或运算符
^:叫做按位异或运算符
~:叫做取反运算符
>>:叫做右移运算符
<<:叫做左移运算符
运算符呢,一共有这6种,作用下面介绍。


&:按位与运算符,是一个二目运算符。功能是将参与运算的两个数按照各个对应的二进制位相与,其运算规则是:若两个运算对象对应的二进制位为1,则结果为1,否则为0

例如: 整数13和21进行按位与运算
     00001101 (13的二进制)
&   00010101 (21的二进制)
——————————————
     00000101 (即5的二进制)

所以13&21=5 即把00000101转化为10进制的5

说明:如果参加按位与运算的数为负整数,则在计算机中,参与运算的数是以补码的形式表现的
    00001001 (-9的二进制补码)
&  00000101  5的补码,正数的补码是其本身)
——————————————
    00000001 (1的二进制补码)

-9&5=1 即00000001转化为10进制数1

总结一下按位与运算的功能

1)如果想将一个数清零,即全部的二进制位为0.只要找到一个数,使它各位的值符合以下条件:源数中为1的位,新数中相应的位为0(就是原来的二进制位中出现1的位置,然后找一个同样位置为0的二进制,或者各个位都为0也可以),然后使两个数进行&运算
例:原数为 00101011,另找一个数,设为10010100,这是一种方法,也可以找一个00000000,符合&运算规则的就可以
2)取一个数的指定位,如果想保留一个数的某些位,即屏蔽其他位,只需要找到一个数,在原数想保留的那几位新数上相应位取值为1,其他位取值为0,然后两个数进行&运算即可,例如:原数为00111001,想取低4位(左端为高,右端为低,还记得么)可以用00001111与原数进行&运算

    00111001
&  00001111
————————
    00001001
从结果可以得知,原数的前4位清零,后4为保持不变

3)测试一个数中的任意一位是否为1

如果想测试一个数的某一位是否为1,只需要找到一个数,在原数想测试的那一位上,新数相应位取值为1,其他位均为0,然后与原数进行&运算即,如果计算结果不为0,说明要测试的位为1,否则说明要测试的数的那个位的值为0

例如:原数 00111001,我想测试一下第5位是否为1,我可以找一个这样的数 00100000
      00111001
&   00100000
————————
      00100000
从结果可以看出我们测试的数据位为1

以上即是按位与的运算,简单的介绍了下,想熟知,请多练习

按位或

有了对按位与的了解,我们对于按位或上手就很快了

|:按位或运算符,它也是个二目运算符。功能是将参与运算的两个数按照各个对应的二进制位相或,其运算规则是:若两个运算对象的对应二进制位有一个是1,那么结果为1否则为0.

还是对整数13和21进行按位或运算

     00001101  (13的二进制)
|    00010101  (21的二进制)
————————
     00011101  (29的二进制)

说明:如果参与运算的对象为负数,则在计算机中参与运算的数是以补码的方式出现

例如:     00001001   (-9的补码)
             |  00000101 (5的补码,正数的补码是其本身)
          ——————————————————————
                00001101  (13的二进制补码)

在C语言中,利用按位或的特点,常用来对一个数据中的某些位定值为1,其余位不变,即将置1的位与1进行按位或运算
,保持不变的位与0进行按位或运算

例如:原数为:00111001,将此数的高四位不变,低四位置为1,我们找一个按照规则说的那样的数,前4位取0000,后四为取1111(16进制的F)

    00111001
|   00001111
————————
    00111111
从结果可以看出,原数的前四位没变,后四位变成了要求的那样为


按位异或运算

1)按位异或运算符^,是一个二目运算符。功能是将参与运算的两个数按照各个对应的二进制位相异或,其运算规则是:若两个运算对象的对应二进制位不相等,则结果的对应为是1,否则为0。一定要注意按位异或跟按位与的区别,一个是相等为1(按位与1&1这种情况),一个是不相等的情况下为1(按位异或)。

例如: 00001101  (13的二进制数)
         ^ 00010101 (21的二进制数)
——————————
            00011000  (24的二进制数)

说明:如果参加按位异或运算的对象为负整数,则在计算机中参与运算的数是以补码的方式出现。

例如:    00001001  (-9的二进制补码)
           ^  00000101   (5的二进制补码,整数的补码是其本身)
————————————
              00001100    (12的二进制补码)

在C语言中,按位异或运算可以实现一下3种功能:
(1)使制定的位翻转,其他位保持不变
如果想使一个数中的某些指定的位翻转,只需要找一个数,在原数需要翻转新数位上的相应位取值为1,在原数需要保持不变的位上新数相应的位取值为0.然后两个数进行按位异或运算。

例如:原数为01111010,使其低4为翻转,我们找一个数,按照定义的来,这个数可以是00001111,然后我们把这两个数进行按位异或运算

    01111010 
^   00001111
————————
    01110101

结果可以看出,原数的前4位没变,后四位去反了,也就是翻转了。

(2)清零

根据按位异或的特点,相同的位进行异或运算结果为0,不相等的位异或运算结果为1
所以可以对一个数跟自己进行按位异或运算

例如:原数为 01111010,可以将这个数跟自己进行按位异或运算

    01111010
^   01111010
____________
    00000000

结果如上

(3)交换两个数的值,不用临时变量

对两个变量进行数据交换时,可以采用按位异或运算的功能来实现

例如: a=3,  b=4 将a,b的值进行交换,可以用一下赋值语句来实现

a=a^b;  (a的二进制为:00000011)
b=b^a;  (b的二进制为:00000100)
a=a^b;

按位取反运算符

按为取反运算符~,是一个单目运算符。功能是将参与运算的数的每一个二进制位进行取反,其运算规则为:将运算对象中的各个二进制位的值取反,0取1,1取0。

例如 9的取反运算如下

    ~00001001
————————
      11110110

左移运算符

左移运算符是一个二目运算符,运算符左边是移位对象,右边是整型表达式(表达式的结果只能为正数),代表左移的位数。功能是将参与运算的数按照各个对应的二进制位向左移动若干位,其运算规则是:将运算对象中的各个二进制位向左移动指定的位数,左移时左端高位的部分舍弃,右端空出的低位用0填充。

例如  int a=6;

a<<2;
运算过程 00000110 (十进制为6)
左移2位  00011000 (十进制为24)

从结果可以看出,左移1位相当于位对象乘2,左移n位相当于移位对象乘以2的n次方因为左移比乘法运算快的多,有些C语言编译程序自动将乘2的运算左移1位来实现,将乘2的n次方的运算,左移n位。


右移运算符

右移运算符>>,是一个二目运算符,运算符左边是移位对象,右边是整型表达式(表达式的结果只能为正数),代表右移的位数。功能是将参与运算的数按照各对应的二进制位向右移动若干位,其运算规则是:将运算对象中的各个二进制位向右移动指定的位数,右移时右端的低位移出的二进制数被舍弃,左端高位补入的二进制数分两种情况进行处理。
(1)对于无符号的整数,在进行右移时,左端高位补入的二进制数为0

例如  unsigned char a = 'A',b;
         b>>2;
运算过程:01000001(十进制数65)
                  00010000(十进制16)


(2) 对于有符号的数,在右移时符号位将随同移动

如果符号位为0(即正数),则右移时左端高位补0;如果符号位为1(即负数),则右移时左端高位补1.最高位补0或是补1取决于编译系统的规定,但需要注意的是,负数在计算机均用补码表示。

例如  int a=-071411,b;
         b=a>>2;

运行结果:

1000110100000000(a的二进制补码)
1110001101000000(a>>2后的b的补码)
1001110011000000 (b的二进制原码)
在C语言的位运算中,左端高位补1以保持负号的方法被称为“算数右移”,左端高位补0的方法称为“逻辑右移”。右移和左移相反,在进行右移时,如果右端低位移出的部分不包含有效的二进制数1,则每右移1位相当于移位对象除2


不同长度的位运算

不同长度的数据在进行位运算时,对象可以是整型和字符型数据,当两个运算数类型补同时,其位数也会补同。遇到这种情况,系统会自动进行如下处理:

(1)先将两个运算数的右端对齐
(2)在将位数短的一个运算数往高位扩充,即:无符号数和正整数左侧用0补全,而负数左侧用1补全;然后对位数相同的两个运算数在按位进行位运算


这次就先总结这么多,以后慢慢的将其他的资源补上来.....
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值