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日

相关文章

  • Android实现串口通信

    下面是详细讲解 “Android实现串口通信”的完整攻略: 0. 总述 在 Android 设备开发中,如何实现串口通信是一个非常重要的话题。本文将从硬件与软件两个方面,分别介绍串口通信的实现流程与方法。其中,硬件部分主要包括 USB 转串口模块的接线及参数设置等;软件部分主要包括串口通信协议选型,比如简单串口通信协议(Simple Serial Proto…

    C 2023年5月23日
    00
  • 怎么用matlab进行矩阵运算?

    下面是详细讲解如何使用MATLAB进行矩阵运算的攻略,包含以下内容: 创建矩阵 矩阵加减法 矩阵乘法 转置矩阵 获取矩阵的行列数 矩阵的逆、行列式、特征值和特征向量计算 1. 创建矩阵 MATLAB中可以使用中括号[]来创建矩阵。例如,下面的代码可以创建一个3行3列的矩阵A: A = [1, 2, 3; 4, 5, 6;7, 8, 9]; 2. 矩阵加减法 …

    C 2023年5月22日
    00
  • Java中异常处理之try和catch代码块的使用

    针对“Java中异常处理之try和catch代码块的使用”,这里提供一些完整的攻略和示例: 异常处理的概念 在编写Java程序时,可能会出现一些异常情况,例如:输入的数据格式不正确、文件不存在等。异常指程序运行时发生了一些不易处理的错误情况,这些错误情况常常导致程序无法正常运行,也可能导致程序崩溃。为了保证程序的稳定性,Java提供了异常处理机制,让程序在出…

    C 2023年5月23日
    00
  • Python面向对象的程序设计详情

    让我们来详细讲解一下“Python面向对象的程序设计详情”。 什么是面向对象编程? 面向对象编程(Object-Oriented Programming,简称 OOP)是一种编程范式或编程思想,它把真实世界中的事物看作是对象,对象与对象之间可以互相交互和影响。在实现面向对象编程时,我们首先要定义类(Class),类是对象的抽象模板,可以描述对象的属性和行为。…

    C 2023年5月22日
    00
  • FFmpeg开发笔记(一)搭建Linux系统的开发环境

    对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库。不过考虑到刚开始仅仅调用FFmpeg的API,不会马上去改FFmpeg的源码,因此只要给系统安装编译好的FFmpeg动态库,即可着手编写简单的FFmpeg程序。比如这个网站https:…

    C语言 2023年4月17日
    00
  • vscode调用c项目后怎么引用dll?

    在VSCode中调用C语言项目,如果需要使用动态链接库(DLL)的话,一般需要进行以下步骤: 创建动态链接库 先编写动态链接库的代码并生成DLL文件。例如,编写一个示例代码,将其保存为 “hello.c”,编译并生成DLL文件 “hello.dll”。示例代码如下: #include <stdio.h> #include <stdlib.h…

    C 2023年5月23日
    00
  • C++中的可移植性和跨平台开发教程详解

    C++中的可移植性和跨平台开发教程详解 C++ 是一种高效的编程语言,具有广泛的应用,因为它提供了机器语言的效率和高级语言的可读性。然而,在编写 C++ 代码时需要考虑可移植性和跨平台开发问题。本文将详细讲解如何编写可移植的代码并在多个平台上运行。 可移植性 可移植性是指代码可以在多种不同的平台上编译和运行而无需进行修改。这是一个非常重要的问题,因为开发人员…

    C 2023年5月23日
    00
  • C语言实现简单的三子棋游戏源码

    下面是“ C语言实现简单的三子棋游戏源码”的完整攻略: 一、三子棋游戏规则 三子棋又叫井字棋游戏,是一款传统的二人对弈类游戏。双方玩家交替将自己的棋子放置在 3×3 的棋盘格子上,先连成一条线(直线、横线、斜线)的为胜者。 二、游戏实现思路 1. 程序结构 本游戏程序的基本框架由以下几个部分构成: /* * 三子棋游戏 * main函数 * 初始化棋盘 * …

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