C 语言基础教程

C 语言流程控制

C 语言函数

C 语言数组

C 语言指针

C 语言字符串

C 语言结构体

C 语言文件

C 其他

C 语言参考手册

C 语言按位运算符

在本教程中,您将通过示例了解C语言编程中所有6个按位运算符。

在算术逻辑单元(位于CPU内)中,诸如位加法,减法,乘法和除法之类的数学运算是在位级别完成的。 要在C编程中执行位级运算,请使用按位运算符。

运算符
运算符的含义
&&按位与
|按位或
^按位异或
~按位补
<<左移位
>>右移位

按位与运算符&

如果两个操作数的对应位为1,则按位与的输出为1。如果一个操作数的任一位为0,则对应位的结果为0。

让我们假设两个整数12和25的按位与运算。

12 = 00001100(二进制)
25 = 00011001(二进制)

12和25的位运算
  00001100
&00011001
  ________
  00001000 = 8(十进制)

范例1:按位与

#include <stdio.h>
int main()
{
    int a = 12, b = 25;
    printf("Output = %d", a&b);
    return 0;
}

输出结果

Output = 8

按位或运算符|

如果两个操作数的至少一个对应位为1,则按位OR的输出为1。在C编程中,按|表示按位OR运算符。

12 = 00001100(二进制)
25 = 00011001(二进制)

12和25的按位或运算
  00001100
| 00011001
  ________
  00011101 = 29(十进制)

范例2:按位或

#include <stdio.h>
int main()
{
    int a = 12, b = 25;
    printf("Output = %d", a|b);
    return 0;
}

输出结果

Output = 29

按位XOR(异或)运算符^

如果两个操作数的对应位相反,则按位XOR运算符的结果为1。用^表示。

12 = 00001100(二进制)
25 = 00011001(二进制)

12和25的按位XOR运算
  00001100
^ 00011001
  ________
  00010101 = 21(十进制)

例3:按位XOR

#include <stdio.h>
int main()
{
    int a = 12, b = 25;
    printf("Output = %d", a^b);
    return 0;
}

输出结果

Output = 21

按位补运算符〜

按位补运算符是一元运算符(仅在一个操作数上起作用)。 它将1更改为0,将0更改为1。用~表示。

35 = 00100011(二进制)

35的按位补码运算
〜00100011 
  ________
  11011100 = 220(十进制)

范例4:按位补示例

#include <stdio.h>
int main()
{
    printf("Output = %d\n",~35);
    printf("Output = %d\n",~-12);
    return 0;
}

输出结果

Output = -36
Output = 11

C语言编程中的移位运算符

C语言编程中有两个移位运算符:

  • 右移运算符

  • 左移运算符。

右移运算符

右移运算符将所有位向右移位指定数量的指定位。用>>表示。

212 = 11010100(二进制)
212 >> 2 = 00110101(二进制)[右移两位]
212 >> 7 = 00000001(二进制)
212 >> 8 = 00000000 
212 >> 0 = 11010100(无移位)

左移运算符

左移运算符将所有位向左移特定数量的指定位。用<<表示。

212 = 11010100(二进制)
212 << 1 = 110101000(二进制)[左移一位]
212 << 0 = 11010100(移位0)
212 << 4 = 110101000000(二进制)= 3392(十进制)

示例#5:移位运算符

#include <stdio.h>
int main()
{
    int num=212, i;
    for (i=0; i<=2; ++i)
        printf("右移 %d: %d\n", i, num>>i);

     printf("\n");

     for (i=0; i<=2; ++i) 
        printf("左移 %d: %d\n", i, num<<i);    
    
     return 0;
}

输出结果:

右移 0: 212
右移 1: 106
右移 2: 53

左移 0: 212
左移 1: 424
左移 2: 848