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日

相关文章

  • C语言关于include顺序不同导致编译结果不同的问题

    C语言中,如果在一个源文件中对不同的头文件的include顺序不同,有可能会导致编译结果不同的问题。 这个问题一般是由于在头文件中使用了宏定义引入其他头文件导致的,而不是因为头文件中的函数或变量重复定义所导致的。 在解决这个问题时,可以采取以下步骤: 尽可能在头文件中使用前置声明避免include其他头文件,只有在真正需要时再include其他头文件。 对于…

    C 2023年5月23日
    00
  • 详解C++图搜索算法之双端队列广搜

    详解C++图搜索算法之双端队列广搜 什么是双端队列广搜 双端队列广搜(Bidirectional Breadth-First Search)是一种图搜索算法,可用于无向图中两点之间的最短路径问题。与传统的广度优先搜索(BFS)相比,双端队列广搜同时从起点和终点出发,通过两端的搜索相遇来实现更快的搜索和更高的效率。 双端队列广搜算法步骤 创建两个队列:起点队列…

    C 2023年5月22日
    00
  • C++中的extern “C”用法详解

    C++中的extern “C”用法详解 简介 在C++中,存在着C和C++的二进制兼容性问题,即C++编译后的函数名与C编译后的函数名不一样。这会导致当我们在头文件中声明一个C++函数的时候,在C语言中无法使用这个函数。所以我们需要在C++ 中使用 extern “C” 关键字声明特定函数,以便在 C++ 环境下使用 C 标准程序声明及定义的函数。 用法 使…

    C 2023年5月23日
    00
  • CGLD是什么币种?一文了解CGLD币怎么样

    CGLD是什么币种? CGLD(Celo Gold)是Celo协议的代币,是以太坊 ERC20 标准代币,也是Celo生态系统中的原生资产。Celo是基于信任的区块链平台,专门设计用于支持金融包容,旨在实现金融服务的覆盖面和可用性。 Celo协议旨在为人们提供使用区块链技术进行支付和汇款服务,特别是为那些没有银行账户的人提供服务。基于Celo 协议的平台允许…

    C 2023年5月23日
    00
  • Golang错误处理方式异常与error

    Golang中,错误处理的方式主要有两种:异常和error。异常是一种在发生错误时立即终止程序运行的方式,而error则是一种返回错误结果的方式,由开发者自行判断如何处理。 异常处理 什么是异常? 异常是一种在运行过程中出现了不可预知、不可避免的错误,导致程序无法正常运行的情况。在Golang中,异常处理的方式主要是利用panic()和recover()两个…

    C 2023年5月23日
    00
  • C语言利用sprintf固定字符串输出位数

    C语言中常用的输出函数是printf,该函数可以输出各种类型的数据,但是无法固定输出的长度。如果想要输出固定长度的字符串,可以使用sprintf函数。本文将详细讲解sprintf固定字符串输出位数的攻略。 sprintf函数概述 sprintf是C语言中的输出函数,其原型为: int sprintf(char *str, const char *format…

    C 2023年5月22日
    00
  • R语言基础统计方法图文实例讲解

    R语言基础统计方法图文实例讲解 本文将为读者讲解使用R语言进行基础的统计分析方法,具体包括了数据的读取、数据展示及探索性数据分析(EDA)、t检验、方差分析及线性回归分析。 1. 数据的读取 在R语言中,我们可以使用以下代码读取csv或Excel文件: # 读取csv文件 data <- read.csv("data.csv", h…

    C 2023年5月22日
    00
  • C++设置超时时间的简单实现方法

    以下是“C++设置超时时间的简单实现方法”的完整攻略。 一、背景介绍 在使用C++进行网络编程时,经常会遇到一些需要设置超时时间的场景,例如: 在进行HTTP请求时,等待服务器返回数据的时间超过设定的时间(例如10秒),则认为该请求失败; 在进行socket通信时,若对方长时间未响应,则认为该连接已超时,需要关闭连接。 本文将介绍如何在C++中简单地实现设置…

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