美文网首页
C 位操作

C 位操作

作者: wjundong | 来源:发表于2022-08-23 10:17 被阅读0次
#include <stdio.h>
#include <stdint.h>

#define BIT(x)          (1 << (x)) 
#define BITS_PER_LONG   32

/*
 * Create a contiguous bitmask starting at bit position @l and ending at
 * position @h. For example
 * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
 */
#define GENMASK(h, l) \
    (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h))))


void printbits(uint32_t n)
{
    if(n >= 2) 
        printbits(n / 2);
    
    printf("%d", n % 2);
}

void print_bit(uint32_t n)
{
    printbits(n);
    printf("\n");
}

int main(int argc, char const *argv[])
{
    uint32_t a = 0xAC; 
    print_bit(a);                       // 输出 10101100
    print_bit(a | BIT(1));              // 输出 10101110, 将某一位设为 1
    print_bit(a & (~BIT(2)));           // 输出 10101000, 将某一位设为 0
    print_bit(a & BIT(3));              // 输出 1000, 判断某一位是否为 1, 其实完整应该是 a & BIT(3) == BIT(3)
    print_bit((a & BIT(3)) >> 3);       // 输出 1, 取得某一位的 0, 1 值

    // 同时检查多个位
    int b = (BIT(7) | BIT(2) | BIT(0));
    print_bit(b);                       // 输出 10000101, 创建 0, 2, 7 位掩码
    print_bit(a & b);                   // 输出 10000100, 检查 a 的 0, 2, 7 位之中至少有一位为 1
    print_bit(a & b == b);              // 输出 0, 同时检测 a 的 0 2 7 这 3 位是否都为 1

    // 当然也可以利用 mask 将多个位同时设 0 或 1
    print_bit(a | b);                   // 输出 10101101, 将 a 的 0, 2, 7 位同时设为 1
    print_bit(a & ~b);                  // 输出 101000, 将 a 的 0, 2, 7 位同时设为 0

    // 生成特定范围内的多位 MASK (掩码), 用法和使用 BIT 创建的掩码一致
    print_bit(GENMASK(6, 1));           // 输出 1111110, 生成 1 ~ 6 位范围的掩码, 包含 1, 6 位
    print_bit(GENMASK(3, 1) | BIT(5));  // 输出 101110, 生成 1, 2, 3, 5 位的掩码

    return 0;
}

相关文章

  • C 位操作

  • C++位操作

    位操作 基本的位操作符有与、或、异或、取反、左移、右移这6种。在这6种操作符,只有取反是单目运算符,其它5种都是双...

  • 位操作

    c++中位操作操作符 这些位操作符只能用于整形的操作,其他会编译报错。位操作符的运算优先级比较低,因为尽量使用括号...

  • C 语言学习(5) ---- C语言知识汇总01

    C语言技巧汇总 元素说明常用位运算对齐,set和reset/reverse,取出相应的位等操作C语言常量整数常量,...

  • C语言的位操作(Two)

    一、位运算赋值运算符 闲话就不多说,直接上图咯。 位运算赋值运算符 二、位运算应用 **eg:取一个整数a从右端开...

  • C语言的位操作(One)

    In a word(一句话):合理利用内存——(导致了位运算的产生) 一、位运算 二、按位&与 eg:求10 &...

  • C语言位操作学习笔记

    一、位操作概述 针对MCU的嵌入是开发中经常涉及到寄存器的操作,例如GPIO配置低寄存器GPIOx_CRL(共32...

  • C语言硬件操作之位操作相关总结

    【引言】: 嵌入式开发工程师有别于其他软件开发工程师,最大的区别就是对硬件操作的敏感性,众所周知,硬件的最...

  • C# 枚举运用"位"操作和"或"操作

    https://www.cnblogs.com/xachary/p/3897708.html 定义:/// //...

  • 【C语言学习】一些操作位的技巧总结

    一、操作位的方法 操作位有两种方法,一种是位字段,另一种是使用按位运算符。位字段的方法可查看往期笔记:【C语言笔记...

网友评论

      本文标题:C 位操作

      本文链接:https://www.haomeiwen.com/subject/mugngrtx.html