C语言中位运算以及获取低8位和高8位、高低位合并

一、位运算

在C语言中,取位操作通常指的是从整数中提取特定位的操作。这可以通过位掩码(bit masks)和位操作符来实现。下面是一些常用的位操作符及其用法:

位与操作符(&):用于提取特定位。

位或操作符(|):用于设置特定位。

位非操作符(~):用于反转特定位。

位异或操作符(^):用于切换特定位。

左移操作符(<<):用于将位向左移动,常用于设置或清除位。

右移操作符(>>):用于将位向右移动。

示例

假设我们要处理一个字节(8位),并想提取、设置或清除其中的特定位。

  1. 提取特定位
    假设我们想提取一个字节的第3位(从0开始计数),可以这样做,下面用二进制直观表示一下:
c 复制代码
unsigned char byte = 0b10101010; // 示例字节值,用二进制表示
unsigned char mask = 0b00000100; // 创建掩码,第3位为1,其余为0
unsigned char result = byte & mask; // 使用位与操作提取第3位
result = result >> 2; // 将结果右移2位以获取第3位的值(因为是从左边开始计数的)

上面用二进制表示的,下面我们用16进制表示一下

  1. 设置特定位

假设我们想设置第3位为1:

c 复制代码
unsigned char byte = 0b10101010; // 示例字节值
unsigned char mask = 0b00000100; // 第3位掩码
byte = byte | mask; // 使用位或操作设置第3位为1
  1. 清除特定位
    假设我们想清除第3位:
c 复制代码
unsigned char byte = 0b10101010; // 示例字节值
unsigned char mask = ~(0b00000100); // 创建掩码并取反,第3位为0,其余为1
byte = byte & mask; // 使用位与操作清除第3位
  1. 切换特定位
    假设我们想切换第3位的值:
c 复制代码
unsigned char byte = 0b10101010; // 示例字节值
unsigned char mask = 0b00000100; // 第3位掩码
byte = byte ^ mask; // 使用位异或操作切换第3位的值

二、获取高8位和低8位

在32位系统上,int通常是4字节,在stm32上就是这样

实验:

  1. 定义了一个32位整数,使用16进制表示
c 复制代码
int num = 0x12345678; // 十六进制表示,总共4个字节
  1. 访问低8位和高8位
    低8位通常指的是最低的有效字节(在大多数现代架构中,这是最低的地址字节)。在32位整数中,我们可以使用按位与操作和位移操作来获取低8位。
c 复制代码
unsigned char low_byte = num & 0xFF; // 使用0xFF掩码来获取低8位

高8位指的是最高有效字节。为了获取高8位,我们可以先右移8位,然后再次应用掩码。

c 复制代码
unsigned char high_byte = (num >> 8) & 0xFF; // 先右移8位以对齐高位,再使用掩码获取高8位
  1. 修改低8位和高8位

如果我们想修改这些位的值,可以使用按位或操作和掩码。

修改低8位

c 复制代码
num = (num & ~0xFF) | new_low_byte; // 清除低8位然后或上新的值

修改高8位

c 复制代码
num = (num & ~(0xFF << 8)) | (new_high_byte << 8); // 清除高8位然后左移新值并或上
  1. 程序示例
c 复制代码
#include <stdio.h>
 
int main() {
    int num = 0x12345678; // 初始值
    unsigned char low_byte, high_byte;
    unsigned char new_low_byte = 0xAB; // 新低8位值
    unsigned char new_high_byte = 0xCD; // 新高8位值
    
    // 获取低8位和高8位
    low_byte = num & 0xFF;   //取低8位
    high_byte = (num >> 8) & 0xFF;   //取高8位
    printf("Original: num = 0x%X, low_byte = 0x%X, high_byte = 0x%X\n", num, low_byte, high_byte);
    
    // 修改低8位和高8位
    num = (num & ~0xFF) | new_low_byte; // 修改低8位
    num = (num & ~(0xFF << 8)) | (new_high_byte << 8); // 修改高8位
    low_byte = num & 0xFF; // 重新获取修改后的低8位
    high_byte = (num >> 8) & 0xFF; // 重新获取修改后的高8位
    printf("Modified: num = 0x%X, low_byte = 0x%X, high_byte = 0x%X\n", num, low_byte, high_byte);
    
    return 0;
}

二、高低位合并

  1. 合并两个独立的8位值
c 复制代码
#include <stdio.h>
#include <stdint.h>
 
uint16_t merge_8bit_values(uint8_t low, uint8_t high) {
    // 将高8位左移8位,然后与低8位进行或操作
    return (high << 8) | low;
}
 
int main() {
    uint8_t low = 0x12; // 二进制 00010010
    uint8_t high = 0x34; // 二进制 00110100
    uint16_t result = merge_8bit_values(low, high);
    printf("Result: 0x%X\n", result); // 输出合并后的结果
    return 0;
}
  1. 合并一个大整数的低8位和高8位
    如果你有一个较大的整数(例如uint16_t或uint32_t),并且想将它的低8位和高8位合并到另一个整数中,你可以这样操作:
c 复制代码
#include <stdio.h>
#include <stdint.h>
 
uint16_t merge_low_high_bits(uint16_t value) {
    // 获取高8位,然后左移8位,与低8位进行或操作
    return ((value & 0xFF00) >> 8) | (value & 0x00FF);
}
 
int main() {
    uint16_t value = 0x1234; // 二进制 00010010 00110100
    uint16_t result = merge_low_high_bits(value);
    printf("Result: 0x%X\n", result); // 输出合并后的结果,应为 0x3412
    return 0;
}
相关推荐
0***m8221 分钟前
Java性能优化实战技术文章大纲性能优化的基本原则
java·开发语言·性能优化
艾莉丝努力练剑7 分钟前
【QT】环境搭建收尾:认识Qt Creator
运维·开发语言·c++·人工智能·qt·qt creator·qt5
2501_901147838 分钟前
单词拆分(Word Break)题解 | 动态规划解法
考研·算法·动态规划
南棱笑笑生9 分钟前
20260113给飞凌OK3588-C开发板适配Rockchip原厂的Android14系统时适配CAM3接口的OV5645
c语言·开发语言·rockchip
Larry_Yanan11 分钟前
Qt安卓开发(二)摄像头打开
android·开发语言·数据库·c++·qt·ui
AAA阿giao15 分钟前
qoder-cli:下一代命令行 AI 编程代理——全面解析与深度实践指南
开发语言·前端·人工智能·ai编程·mcp·context7·qoder-cli
m0_7482500317 分钟前
C++ 修饰符类型
开发语言·c++
李日灐22 分钟前
C++STL:仿函数、模板(进阶) 详解!!:“伪装术”和模板特化、偏特化的深度玩法指南
开发语言·c++·后端·stl
翱翔的苍鹰23 分钟前
使用PyTorch实现线性回归的完整流程
算法·回归·线性回归
rgeshfgreh26 分钟前
Python连接KingbaseES数据库全指南
开发语言·数据库·python