【C语言】一篇搞懂位运算

举报
人才程序员 发表于 2024/07/28 20:25:19 2024/07/28
【摘要】 @TOC 前言位运算是计算机底层操作的重要组成部分。通过位运算,我们可以直接操作数据的二进制表示,从而实现高效的计算和控制。尽管在日常编程中,位运算并不是最常用的操作,但在某些特定场合,如嵌入式系统、图像处理和加密算法中,位运算具有无可替代的优势。本文将详细介绍C语言中的所有位运算及其含义,并通过二进制示例来帮助读者更好地理解这些操作。 什么是位运算?位运算是对整数类型的二进制位进行操作的运...

@TOC


前言

位运算是计算机底层操作的重要组成部分。通过位运算,我们可以直接操作数据的二进制表示,从而实现高效的计算和控制。尽管在日常编程中,位运算并不是最常用的操作,但在某些特定场合,如嵌入式系统、图像处理和加密算法中,位运算具有无可替代的优势。本文将详细介绍C语言中的所有位运算及其含义,并通过二进制示例来帮助读者更好地理解这些操作。


什么是位运算?

位运算是对整数类型的二进制位进行操作的运算。它们直接操作数据的二进制表示,每个位(bit)作为一个独立的单位进行处理。C语言中提供了几种常见的位运算符,包括与运算、或运算、异或运算、取反运算、左移运算和右移运算。

C语言中的位运算

与运算(&)

与运算符&对两个数的每一位进行与操作,只有当对应的两位都是1时,结果位才为1,否则为0。

示例:

#include <stdio.h>

int main() {
    int a = 5;  // 二进制: 0101
    int b = 3;  // 二进制: 0011
    int result = a & b; // 结果: 0001

    printf("5 & 3 = %d\n", result); // 输出: 1
    return 0;
}

或运算(|)

或运算符|对两个数的每一位进行或操作,只要对应的两位中有一个是1,结果位就为1。

示例:

#include <stdio.h>

int main() {
    int a = 5;  // 二进制: 0101
    int b = 3;  // 二进制: 0011
    int result = a | b; // 结果: 0111

    printf("5 | 3 = %d\n", result); // 输出: 7
    return 0;
}

异或运算(^)

异或运算符^对两个数的每一位进行异或操作,当对应的两位不同(一个为1,一个为0)时,结果位为1,否则为0。

示例:

#include <stdio.h>

int main() {
    int a = 5;  // 二进制: 0101
    int b = 3;  // 二进制: 0011
    int result = a ^ b; // 结果: 0110

    printf("5 ^ 3 = %d\n", result); // 输出: 6
    return 0;
}

取反运算(~)

取反运算符~对一个数的每一位进行取反操作,即将0变为1,1变为0。

示例:

#include <stdio.h>

int main() {
    int a = 5;  // 二进制: 0000 0101
    int result = ~a; // 结果: 1111 1010 (对于32位整数会是: 1111 1111 1111 1111 1111 1111 1111 1010)

    printf("~5 = %d\n", result); // 输出: -6
    return 0;
}

左移运算(<<)

左移运算符<<将一个数的所有位向左移动指定的位数,右边用0填充。左移相当于乘以2的移动位数次方。

示例:

#include <stdio.h>

int main() {
    int a = 5;  // 二进制: 0000 0101
    int result = a << 1; // 结果: 0000 1010

    printf("5 << 1 = %d\n", result); // 输出: 10
    return 0;
}

右移运算(>>)

右移运算符>>将一个数的所有位向右移动指定的位数,左边用符号位填充(对有符号数)或用0填充(对无符号数)。右移相当于除以2的移动位数次方(向下取整)。

示例:

#include <stdio.h>

int main() {
    int a = 5;  // 二进制: 0000 0101
    int result = a >> 1; // 结果: 0000 0010

    printf("5 >> 1 = %d\n", result); // 输出: 2
    return 0;
}

对于左移和右移的一些小tips

如果一个八位二进制是1000,0000它左移动一位会怎么样?
通过计算器可得0000,0001,我们就发现了,当在最高位还左移一位,那么就会导致最高位变成最低位
那么左移也是一样的,当在最高位还右移一位,那么就会导致最低位变成最高位
0000,00011000,0000非常的简单


总结

位运算是C语言中一个重要的特性,能够直接操作数据的二进制位,从而实现高效的计算和控制。本文介绍了C语言中的所有位运算符及其含义,并通过二进制示例演示了每种运算的具体操作。掌握位运算不仅可以提高程序的性能,还可以帮助我们更好地理解计算机底层操作。在特定应用场景下,合理使用位运算能够大大提升程序的效率和功能。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。