首页 > 其他分享 >c语言位运算符和位运算,位运算举例,位段

c语言位运算符和位运算,位运算举例,位段

时间:2024-08-03 09:24:51浏览次数:16  
标签:00000101 位段 运算 int bitFields 运算符 二进制

位运算符

1. 按位与运算符 (&)

按位与运算符对两个整数的每一位进行“与”操作,只有当两个位都是1时,结果才为1,否则为0。
int a = 5;  // 二进制: 00000101
int b = 3;  // 二进制: 00000011
int result = a & b;  // 结果: 00000001 (1)

2. 按位或运算符 (|)

按位或运算符对两个整数的每一位进行“或”操作,只要有一个位是1,结果就为1,否则为0。
int a = 5;  // 二进制: 00000101
int b = 3;  // 二进制: 00000011
int result = a | b;  // 结果: 00000111 (7)

3. 按位异或运算符 (^)

按位异或运算符对两个整数的每一位进行“异或”操作,当两个位不同,结果为1,相同时为0。
int a = 5;  // 二进制: 00000101
int b = 3;  // 二进制: 00000011
int result = a ^ b;  // 结果: 00000110 (6)

4. 取反运算符 (~)

取反运算符对整数的每一位进行“取反”操作,0变1,1变0。
int a = 5;  // 二进制: 00000101
int result = ~a;  // 结果: 11111010 (对于32位整数,结果为-6)

在有符号整数中,按位取反是针对补码进行操作的,因此取反后的结果表示的是该数的补码形式。

5. 左移运算符 (<<)

左移运算符将一个整数的二进制表示向左移动指定的位数,右侧用0填充,左侧的位丢弃。
int a = 5;  // 二进制: 00000101
int result = a << 1;  // 结果: 00001010 (10)

6. 右移运算符 (>>)

右移运算符将一个整数的二进制表示向右移动指定的位数,左侧用符号位填充(对于有符号整数),右侧的位丢弃。
int a = 5;  // 二进制: 00000101
int result = a >> 1;  // 结果: 00000010 (2)

复杂的位运算举例

交换两个整数而不使用临时变量
int x = 5;  // 二进制: 00000101
int y = 3;  // 二进制: 00000011

x = x ^ y;  // x 变为 00000110 (6)
y = x ^ y;  // y 变为 00000101 (5)
x = x ^ y;  // x 变为 00000011 (3)

// 最终 x = 3, y = 5
 

判断一个整数是否为2的幂
int n = 16;  // 二进制: 00010000
bool isPowerOfTwo = (n & (n - 1)) == 0;  // true,因为16是2的幂

位段(Bit Fields)

位段是C语言结构体的一部分,可以指定成员变量占用的位数。在嵌入式系统或需要节省内存的应用中非常有用。

定义位段
#include <stdio.h>

struct {
    unsigned int a : 1;  // 占1位
    unsigned int b : 3;  // 占3位
    unsigned int c : 4;  // 占4位
} bitFields;

int main() {
    bitFields.a = 1;  // 设置位段a为1
    bitFields.b = 5;  // 设置位段b为5(二进制: 101)
    bitFields.c = 9;  // 设置位段c为9(超出范围,结果取最低4位:二进制: 1001)

    printf("a: %u, b: %u, c: %u\n", bitFields.a, bitFields.b, bitFields.c);
    return 0;
}

在这个例子中,bitFields结构体包含三个位段:

- a 占用1位,范围是0到1。
- b 占用3位,范围是0到7。
- c 占用4位,范围是0到15。

位段的使用可以显著节省内存,但也带来了一些潜在的问题:

1. 位段的内存布局和对齐方式依赖于具体的编译器和平台。
2. 位段的访问和操作可能比普通整数操作稍慢。

标签:00000101,位段,运算,int,bitFields,运算符,二进制
From: https://blog.csdn.net/lexc_/article/details/140878351

相关文章

  • 第五章 向量运算(知识点及笔记)
    以下是第五章(向量运算)的知识点,笔记也给大家整理好了......
  • C语言自定义类型结构体与位段超详解
    文章目录1.结构体类型的声明1.1结构体声明1.2结构体变量的创建和初始化1.3结构体的特殊声明1.3结构体的自引用2.结构体内存对齐2.1对齐规则2.2为什么存在内存对齐2.3修改默认对齐数3.结构体传参4.结构体实现位段4.1什么是位段4.2位段成员的内存......
  • 共用体、typedef、位运算
    共用体定义:共用体是一个用户自定义的类型,包含多个不同类型的成员,但在同一时间只能存储其中一个成员的值。共用体的声明类似于结构体,但使用关键字union。unionExample{inti;floatf;charc;}; 内存分配:共用体的大小等于其最大成员的大小。例如,如果......
  • 【C++】运算符重载
    一、示例如果我想实现以下代码,按照下面的写法是不能正常运行的。classPerson{public:intm_A;intm_B;};Personp1;p1.m_A=10;p1.m_B=10;Personp2;p2.m_A=10;p2.m_B=10;Personp3;p3=p1+p2;按照以上学过的内容,可以自己写成员函数,实......
  • 链表尾插法、头删、尾删,共用体、位运算。
    一、链表1、尾插程序:2、头删3、尾删4、清空链表二、共用体1、定义:union 共用体名(首字母大写。所占字节大小:结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。但是整体大......
  • Luogu P5005 中国象棋 - 摆上马 / Luogu P8756 国际象棋 题解 [ 蓝 ] [ 状压 dp ] [
    国际象棋:模板棋盘状压。摆上马:需要点思维的棋盘状压,相比上一道题加了“蹩马脚”的设定。Easy_version:国际象棋概述一下此类棋盘问题的思路:用二进制数表示出棋盘上某一行的状态。用位运算预处理出合法的单行状态,以及需要用到的一些东西。用位运算判断前一行或者前几行能否......
  • 学习C语言的第4天--运算符与流程控制
    今日目标了解各种运算符及其用法。掌握条件语句和循环语句的使用。每日练习目录今日目标运算符1.算术运算符2.关系运算符3.逻辑运算符4.位运算符5.赋值运算符6.其他运算符条件运算符(三元运算符)指针运算符逗号运算符流程控制1.条件语句if语句if-else语句......
  • 几个典型运算符之间的区别
    几个典型运算符之间的区别1.i++与++ii++(后缀递增运算符):这被称为后缀递增运算符。它首先返回变量i的当前值,然后将i的值增加1。通常用于循环计数器的递增。++i(前缀递增运算符):这被称为前缀递增运算符。它首先将i的值增加1,然后返回新的值。通常用于确保变量的值......
  • Java中的运算符
    Java中的运算符Java中的运算符用于执行程序中的各种操作,如赋值、算术运算、比较、逻辑运算等。以下是Java中的主要运算符类型及其用法:赋值运算符(=):用于将右侧的值赋给左侧的变量。算术运算符:+加法-减法*乘法/除法%取模(求余数)++递增(使变量值增加1)--......
  • C/C++ 运算符优先级相关的注意事项
    在C/C++中,运算符优先级决定了表达式中各部分的计算顺序。理解并正确应用运算符优先级是确保程序逻辑正确性的关键。以下是关于C/C++运算符优先级相关的一些重要注意事项:优先级层次:C/C++中的运算符按优先级从高到低排序。例如,算术运算符(+、-、*、/)的优先级高于赋值运算符(=)......