C语言 位运算详解及示例代码

C语言 位运算详解及示例代码

什么是位运算

在计算机中,数据存储采用二进制的形式,二进制位只有0和1两个取值。位运算是一种直接针对二进制位进行操作的运算,常见的位运算包括按位与、按位或、按位异或、位左移、位右移等。

位运算的分类

在C语言中,位运算可以分为3类:按位逻辑运算符、按位位移运算符和按位赋值运算符。

按位逻辑运算符

按位逻辑运算符用于操作二进制数中的每一位。C语言中的按位逻辑运算符包括:

  • 按位与:&
  • 按位或:|
  • 按位异或:^
  • 按位取反:~

按位与运算符&的结果为1,则表示两个数的对应二进制位上都是1;按位或运算符|的结果为1,则表示两个数的对应二进制位上至少有一个是1;按位异或运算符^的结果为1,则表示两个数的对应二进制位上一个是1一个是0;按位取反运算符~将一个数的二进制位0变1,1变0。具体示例如下:

#include <stdio.h>

int main() {
    int a = 0b1101; // a的二进制为1101
    int b = 0b0011; // b的二进制为0011

    printf("a & b = %d\n", a & b); // 输出:a & b = 0001,相当于a和b的二进制的每个位置上进行与运算
    printf("a | b = %d\n", a | b); // 输出:a | b = 1111,相当于a和b的二进制的每个位置上进行或运算
    printf("a ^ b = %d\n", a ^ b); // 输出:a ^ b = 1110,相当于a和b的二进制的每个位置上进行异或运算
    printf("~a = %d, ~b = %d\n", ~a, ~b); // 输出:~a = 11111111111111111111111111110010, ~b = 11111111111111111111111111111100
    return 0;
}

按位位移运算符

按位位移运算符可以将一个十进制的数字转为二进制后,将二进制数向左或向右移动一定的位数,然后转为十进制。C语言中的按位位移运算符包括:

  • 左移运算符:<<
  • 右移运算符:>>

假设有一个数x,将它左移y位,相当于将x的二进制数转化为十进制后乘以2的y次方,将它右移y位,相当于将x的二进制数转化为十进制后除以2的y次方。具体示例如下:

#include <stdio.h>

int main() {
    int x = 0b1010; // 十进制数为10

    printf("x << 2 = %d\n", x << 2); // 输出:x << 2 = 40,等同于10 * (2 ^ 2)
    printf("x >> 2 = %d\n", x >> 2); // 输出:x >> 2 = 2,等同于10 / (2 ^ 2)
    return 0;
}

按位赋值运算符

按位赋值运算符既可以实现赋值操作,又可以同时进行位运算。C语言中的按位赋值运算符包括:

  • &=
  • |=
  • ^=
  • <<=
  • =

例如:

#include <stdio.h>

int main() {
    int a = 0b1101; // a的二进制为1101

    a &= 0b0011; // a的二进制为0001,相当于执行了a = a & 0b0011;
    printf("a = %d\n", a); // 输出:a = 1

    a |= 0b0100; // a的二进制为0101,相当于执行了a = a | 0b0100;
    printf("a = %d\n", a); // 输出:a = 5

    a ^= 0b1111; // a的二进制为0100,相当于执行了a = a ^ 0b1111;
    printf("a = %d\n", a); // 输出:a = 10

    a <<= 2; // a的二进制为101000,相当于执行了a = a << 2;
    printf("a = %d\n", a); // 输出:a = 40

    a >>= 1; // a的二进制为10100,相当于执行了a = a >> 1;
    printf("a = %d\n", a); // 输出:a = 20

    return 0;
}

示例说明

示例1:通过位运算打印一个整数的二进制表示

#include <stdio.h>

void print_binary(int x) {
    int mask = 1 << sizeof(int) * 8 - 1;
    for (int i = 0; i < sizeof(int) * 8; i++) {
        if ((x & mask) == mask) {
            printf("1");
        } else {
            printf("0");
        }
        mask >>= 1;
    }
}

int main() {
    int num = 0b11011011;
    print_binary(num);
    return 0;
}

以上代码的输出结果为:11011011

示例2:判断一个数是否为2的幂

#include <stdio.h>

int is_pow_of_two(int x) {
    if (x == 0) {
        return 0;
    }
    if ((x & (x - 1)) == 0) {
        return 1;
    }
    return 0;
}

int main() {
    int num = 16;
    if (is_pow_of_two(num)) {
        printf("%d是2的幂\n", num);
    } else {
        printf("%d不是2的幂\n", num);
    }
    return 0;
}

以上代码的输出结果为:16是2的幂

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 位运算详解及示例代码 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • 系统提示lsass.exe失败状态代码c0000005的解决方法

    解决“系统提示lsass.exe失败状态代码c0000005”的方法 什么是lsass.exe? lsass.exe是Windows操作系统中的一个进程,它负责处理用户登录信息等安全相关的任务。由于其重要性,所以典型情况下,它的进程权限是系统管理员。 了解错误信息 在运行Windows操作系统时,您可能会看到一个弹出对话框,指示“lsass.exe失败,状态…

    C 2023年5月23日
    00
  • 使用C语言访问51单片机中存储器的核心代码

    让我来为您详细讲解如何使用C语言访问51单片机中存储器的核心代码的完整攻略。 1. 了解51单片机存储器 在51单片机中,存储器分为RAM和ROM两种类型,其中RAM用于临时存储数据,而ROM则用于存储程序及常量等固化数据。访问51单片机中的存储器需要使用C语言提供的指针功能,通过指向特定地址的指针进行读写操作。 2. 访问RAM 访问RAM很简单,只需要使…

    C 2023年5月24日
    00
  • 用C语言实现简单扫雷游戏

    使用C语言实现简单扫雷游戏需要以下步骤: 1. 设计游戏界面和游戏规则 游戏界面通常包括地图,雷数和计时器等元素。根据游戏规则,地图应该是一个矩形,且长宽可以自定义,地图中会布置一些地雷。游戏目标是找出所有不是地雷的方块,并标记地雷方块的位置。 2. 初始化地图和地雷分布 定义地图大小和雷数,并用二维数组来表示地图,将地图中所有元素赋为‘0’或’ ‘,表示未…

    C 2023年5月23日
    00
  • 电脑越来越卡怎么办 手写CCleaner电脑垃圾文件清理规则

    关于“电脑越来越卡怎么办”这个问题,我们可以通过手写CCleaner电脑垃圾文件清理规则来优化电脑性能。以下就是详细的攻略: 步骤一:下载和安装CCleaner 首先,我们需要从官方网站下载并安装CCleaner。下载链接:https://www.ccleaner.com/ccleaner/download 步骤二:运行CCleaner 安装完成后,我们可以…

    C 2023年5月23日
    00
  • 用C语言来实现一个简单的虚拟机

    实现一个简单的虚拟机可以分为以下几个步骤: 设计虚拟机的指令集 编写解析器,将程序代码转化为虚拟机指令 实现虚拟机的内存管理、寄存器、堆栈等功能 实现指令执行器,按照指令集执行代码 具体实现过程如下: 设计虚拟机指令集 首先需要设计虚拟机的指令集,指令集需要包括操作指令、流程控制指令等等。在这里我们设计一个简单的指令集,包括以下几种指令: 指令 功能 pus…

    C 2023年5月23日
    00
  • C语言实现小学生计算机辅助教学系统

    C语言实现小学生计算机辅助教学系统攻略 目标 本攻略将指导您如何使用C语言编写一个小学生计算机辅助教学系统,该教学系统可以帮助小学生进行加减乘除练习,并评估他们的表现。 步骤 设计用户界面 首先,您需要设计一个用户界面。您可以使用如下的代码块来创建用户界面。该用户界面将会展示程序的功能菜单和用户可以选择的操作。在此示例中,我们提供了四个选项,分别对应加、减、…

    C 2023年5月30日
    00
  • VC++简单实现关机、重启计算机实例代码

    现在我会详细讲解VC++简单实现关机、重启计算机实例代码的完整攻略。 什么是VC++? VC++是指微软的Visual C++开发工具,它是一种基于C++语言的编程软件,提供了方便的视觉化开发环境,可以轻松地实现众多应用程序和系统级程序的编写。 实现关机、重启计算机 实现原理 VC++实现关机和重启计算机的原理其实也很简单,就是调用Windows API中的…

    C 2023年5月24日
    00
  • python中解析json格式文件的方法示例

    关于“python中解析json格式文件的方法示例”的攻略,我来详细讲解一下。 什么是JSON格式文件 首先,我们需要了解一下什么是JSON格式文件。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写。它基于JavaScript的一个子集,表示为对象(object),属性(key)和值(value)的集…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部