位运算

1、简介:

        C语言是为描述系统设计的,因此它应该具有汇编语言所有完成的一些功能。C语言既有高级语言的特点,又具有低级语言的功能。因而具有广泛的用途和很强的生命力。


2、位运算符合位运算

        运算符        含义

        &             按位与

        |             按位或  

        ^            按位异或    

        ~            按位取反    

        <<           左移     

        >>           右移    

        说明:(1)位运算符中除了~之外,均为二目运算符,即要求两侧各有一个运算量。

              (2)运算量只能是整形或字符型的数据,不能为实型数据。


3、“按位与” 运算符 (&)

        参加运算的两个数字,按二进制进行 “与” 运算。如果两个相对应的二进位数为1,刚该位的结果为 1,否则为 0。 即:

        0 & 0 = 0;        0 & 1 = 0;        1 & 0 = 0;        1& 1 = 1

        例如:3 & 8 并不等于8,应该是按位与

        3 = 00000011

        &

        5 = 00000101 

        =  0000001

        因此 3 & 5 的值得 1, 如果参加 & 是负数(-3 & -5),则以补码形式表示为二进制数。然后按位进行”与“运算。

        按拉与有一些特殊的用途:

        (1)清零。如果想将一个单元清零,即其全部二进位置为 0,只要找一个二进制数,其中各个二进位符合以下条件:原来数中为 1 的位,新数中相应位为 0。然后使二者进行 & 运算,即可以达到清零目的。

        (2)取一个数中某些指定位。如有一个整数 a (2个字节)想要其中的低字节。只需将 a 与(337)。按位与即可。

        (3)要想将哪一个保留下来,就与一个数进行 & 运算,此数在该位位1,如有一个数 01010100,想把其中左面第3,4,5,7,8可以这样运算:

                01010100

            &  

                00111011 

           =  

                00010000

4、“按位或” 运算符 (|)

        两个相对应的二进位中只要有一个为1,该位的结果就位1.

        0 | 0 = 0;        0 | 1 = 1; 1 | 0 = 1;        1 | 1 = 1;


5、“按位异或” 运算符 (^)

        按位异或运算符 ^ 也成XOR运算符,它的规则是参见运算的两个二进位同号,则结果为0,异号则为1.

        0 | 0 = 0;        0 | 1 = 1;      1 | 0 = 1;        1 | 1 = 0;

        下面举例说明 ^ 运算符的应用。

        (1)使特定位翻转

        假设有 0111 1010, 想使其低4位翻转,即1变为0,0变为1,可以将它与0000 1111 进行^运算。

            0111 1010

         ^ 0000 1111

         = 0111 0101

        (2)交换两个值,不用临时变量

        假如 a = 3, b = 4。交换 a和b 的值

        转二进制:a= 011,b = 100

        a = a^b            a = a^b      011                 b = a^b       111                 a = a^b       111

        b = a^b                          ^ 100                               ^ 100                                ^ 011 

        a = a^b                          =  111                b             =  011                  a            = 100

        转十进制:a = 4, b = 3.

6、“按位取反” 运算符 (~) 

        ~是单目运算符,用来对一个二进制按位取反,即 将0变1,将1变0.     

        ~ 0101 = 1010

7、“左移” 运算符 (<<)

        用来将一个二进位全部左移若干位。 如:

        a = a << 2

        将a的二进制数左移2位,右补0,。

        若 a = 15,即二进制数 0000 1111, 左移两位得到 0011 1111,即10进制的60.

        注:高位左移后溢出,则直接舍弃,不起作用。

        左移一位相当于该数乘以2,但是该结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。左移运算要比乘法运算快的多,有些C编译程序自动将乘2的运算用左移来实现。

8、“右移” 运算符 (>>)

        用来将一个二进位全部左移若干位。右端溢出的位被舍弃在右移时,需要注意符号位问题。对无符号数据,右移时,左端空出的位用0补充。对于带符号

的数据,如移位前符号位为0(正数),则左端也是用0补充;如果移位前符号位为1(负数),左端用0或用1补充,取决于计算机系统。对于负数右移,称用0补

充的系统为“逻辑右移”,用1补充的系统为“算术右移”。以下代码能说明读者上机的系统所采用的右移方法:

     printf("%d\n\n\n", -2>>4);  若输出结果为-1,是采用算术右移;输出结果为一个大整数,则为逻辑右移。


9、不同长度的数据进行位运算

        如果两个数据长度不同(如:long型和int型)进行位运算时。

        如:a为long型,b为int型  a&b

        系统会将二者按右端对齐,如果b位正数,则左侧16位补满0,若b为负数,左侧应补满1。如果b位无符号整形,则左侧应补满0.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值