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;
}
相关推荐
FirstFrost --sy7 分钟前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先
森焱森18 分钟前
垂起固定翼无人机介绍
c语言·单片机·算法·架构·无人机
搂鱼11451436 分钟前
(倍增)洛谷 P1613 跑路/P4155 国旗计划
算法
Yingye Zhu(HPXXZYY)38 分钟前
Codeforces 2021 C Those Who Are With Us
数据结构·c++·算法
liulilittle2 小时前
LinkedList 链表数据结构实现 (OPENPPP2)
开发语言·数据结构·c++·链表
无聊的小坏坏2 小时前
三种方法详解最长回文子串问题
c++·算法·回文串
长路 ㅤ   2 小时前
Java后端技术博客汇总文档
分布式·算法·技术分享·编程学习·java后端
2401_891957312 小时前
list的一些特性(C++)
开发语言·c++
秋说2 小时前
【PTA数据结构 | C语言版】两枚硬币
c语言·数据结构·算法
二十雨辰2 小时前
[尚庭公寓]07-Knife快速入门
java·开发语言·spring