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;
}
相关推荐
烟锁池塘柳014 小时前
【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法
开发语言·python·matplotlib
周小码14 小时前
llama-stack实战:Python构建Llama应用的可组合开发框架(8k星)
开发语言·python·llama
lifallen14 小时前
揭秘KafkaStreams 线程缓存:NamedCache深度解析
数据结构·算法·缓存·kafka·apache
我的知识太少了14 小时前
P1122 最大子树和
算法
UrSpecial14 小时前
Linux线程
linux·开发语言·c++
郝学胜-神的一滴14 小时前
深入浅出 C++20:新特性与实践
开发语言·c++·程序人生·算法·c++20
Jelena技术达人15 小时前
淘宝/天猫按图搜索(拍立淘)item_search_img API接口实战指南
算法·图搜索算法
闪电麦坤9515 小时前
C/C++项目练习:命令行记账本
开发语言·c++
九皇叔叔15 小时前
【2】标识符
c语言
Adorable老犀牛15 小时前
阿里云-基于通义灵码实现高效 AI 编码 | 8 | 上手实操:LeetCode学习宝典,通义灵码赋能算法高效突破
学习·算法·leetcode