C语言中的按位运算

来源:互联网 发布:怎么找淘宝内部优惠券 编辑:程序博客网 时间:2024/06/18 08:17

按位操作的运算符好如下:

&:按位与(and) 两个相应的二进制位都为1,则该位的结果值为1,否则为0

|:按位或(or) 两个相应的二进制位中只要有一个为1,该位的结果值为1

^:按位异或(xor)两个相应的二进制数对应的位值不相同则为1,否则为0

>>:向右移位   向右移N个单位,其他位用0补齐

<<:向左移位  向左移N个单位,其他位用0补齐

~:按位求反(一元运算符) 取相反的值


这些操作符号只能用于带符号,或者无符号的char short int long类型的数值


按位与 按位或者全部清零

原来的数是11,想对其清零则 111&000 其值等于000 = 0

原来的数是111,相对后两位清零 111&100 = 100

按位或  按位取值

原来的数是1110,取后边的两位值1110|0011 = 10前边的0可以忽略

按位异或 若参加运算的两个二进制位值相同则为0,否则为1

原来的数是1011,另一个数为1110 1011^1110 = 101前边的0可以忽略

原来的数是1101,另一个数是1111 1101^1111 = 0010 = 10 反转1101的值1的位全部为0 0的位全部为1



左移运算符(<<)
左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负

值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
例如:将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍弃。若a=15,即00001111(2),左移2

位得00111100(2)。
源代码:
#include <stdio.h>
main()
{
 int a=15;
 printf("%d",a<<2);
}
左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。但此结论只适用于该

数左移时被溢出舍弃的高位中不包含1的情况。
    假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0

,而左移2位时,溢出的高位中包含1。

右移运算符(>>)
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负

值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分

用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注

意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移

入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的

系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
例: a的值是八进制数113755:
   a:1001011111101101 (用二进制形式表示)
   a>>1: 0100101111110110 (逻辑右移时)
   a>>1: 1100101111110110 (算术右移时)
   在有些系统中,a>>1得八进制数045766,而在另一些系统上可能得到的是145766。Turbo C和其他一些C

编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。
源代码:
#include <stdio.h>
main()
{
 int a=0113755;
 printf("%d",a>>1);
}

位运算赋值运算符

位运算符与赋值运算符可以组成复合赋值运算符。
   例如: &=, |=, >>=, <<=, ∧=
   例:  a & = b相当于 a = a & b
         a << =2相当于a = a << 2

以上按位运算赋值,左移和右移整理自网络


例子:

[root@CWG hc]# cat awys.c
#include <stdio.h>
main()
{
    int a = 43;    //0101011
    int b = 85;    //1010101
    int c = 127;    //1111111
    int d = 0;    //0000000
    int x = 3;    //11
    int y = 4;    //100
    printf("a & b  = %d\n", a & b); //a&b = 0000001 = 1
    printf("a | b  = %d\n", a | b); //a|b = 1111111 = 127
    printf("a ^ b  = %d\n", a ^ b); //a^b = 1111110 = 126
    printf("c >> 2 = %d\n", c >> 2); //c>>2 = 0011111 =31
    printf("c << 2 = %d\n", c << 2); //c<<2 = 111111100 =31
    printf("d ~  = %d\n", ~ c);
    x = x ^ y;
    y = y ^ x;
    x = x ^ y;
    printf("x , y = %d , %d\n", x, y);    
    //关于^能进行交换变量值的过程
    //x = 011
    //y = 100
    //x = 111
    //y = 100 ^ 111 = 011
    //x = 111 ^ 011 = 100
}

[root@CWG hc]# ./awys
a & b  = 1
a | b  = 127
a ^ b  = 126
c >> 2 = 31
c << 2 = 508
d ~  = -128
x , y = 4 , 3


以上是C语言中的按位运算


##############################################

迷途小运维学习C程序语言笔记

作者:john

转载请注明出处

原创粉丝点击