C 语言中位操作技巧

C语言 | 嵌入式位操作精华技巧汇总 分享关于位操作一些笔记: 一、位操作简单介绍 首先,以下是按位运算符: 在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作。下面进行举例说明,假如有一个8位的TEST寄存器: 当我们要设置第0位bit0的值为1时,可能会这样进行设置: TEST = 0x01; 但是,这样设置是不够准确的,... 阅读详情

作者: comcat 发表日期: 2006-10-17 21:04     http://comcat.blog.openrays.org/blog.php?do=showone&tid=130

 

注: 本文仅讨论常见的小端机器

1. 声明

对于RGB模式下, 8 bit 颜色可以用一个字节描述:

7 5 4 2 1 0
|-------|--------|-----|
R G B
|---------------------|


则可以定义数据结构为:

struct color8
{
unsigned char blue : 2; // 2 bit for B
unsigned char green : 3; // 3 bit for G
unsigned char red : 3; // 3 bit for R
};

容易得到 sizeof(struct color8) 的值为 1 Byte


注意 struct color8 中成员的声明顺序, 先声明的成员,在内存中的位置在低位

使用上面的 struct color8, 可以很容易的转为1字节,用于显示:

struct color8 c8;

c8.red = 4; // 值不能超过7
c8.green = 0;
c8.blue = 2;
unsigned char * tran = (unsigned char *)&c8

printf("8 bit color value is: 0x%x\n", *tran);

//100 000 10
则输出为: 8 bit color value is: 0x82


2. 赋值

低位赋予原则,直至目的变量之所有位填满.

如:

struct color8 c8;
unsigned char i = 0x82; // 1000 0010

c8.blue = i; // 将 i 之低2位(1~0)赋给成员blue(长2位), 其值为 0x2
c8.green = i >> 2; // 将 i 之 4~2 位赋予成员green(长3位), 其值为 0x0
c8.red = i >> 5; // 将 i 之 7~5 位赋给成员red(长3位), 其值为 0x4


3. 16bit 值的合并

在RGB模式下, 16 bit 颜色可以用二个字节描述:

15 14 10 9 5 4 0
|---|-------|-------|-------|
| x | R | G | B |
|--------------------------|

struct color16
{
unsigned char b:5;
unsigned char g:5;
unsigned char r:5;
unsigned char ge:1;
};

注意到 sizeof(struct color16) 的值为 3 Byte

因为要便于机器访问以字节为单位的存储单元,上述结构在内存中的布局为:

7 5 4 0
|------|---------| 低地址
| 0 | b |
|------|---------|
| 0 | g |
|------|---------|
| 0 |ge| r |
|------|---------| 高地址

故而:

struct color16 cx;
cx.r = 4;
cx.g = 1;
cx.b = 3;
cx.ge = 1;
printf(" 0x%x \n", *((unsigned short*)&cx));

输出为 0x103,

分析:

经赋值后内存映象为:

000 00011 -----> 1st byte
000 00001 -----> 2nd byte
001 00100 -----> 3rd byte

强制地址转换后访问前二个字节,输出时则为: 0000 0001 0000 0011


又:
printf(" 0x%x \n", *((unsigned char*)&cx + 2));

输出为 0x24, 即为第三个字节 0010 0100 的值


经以上分析,在非对齐的数据结构中使用指针强制转换的方式合并数据位是不可行的,
可用以下方法实现:

unsigned short tt = 0, t = 0;
t = cx.ge;
t <<= 15;
tt = t;

t = cx.r;
t <<= 10;
tt |= t;

t = cx.g;
t <<= 5;
tt |= t;

tt |= cx.b;
C语言位操作:从基础到高级技巧 本文深入探讨了C语言中的位操作,包括结构体、联合体、位操作和枚举的基础知识,以及位掩码的使用、位运算符的应用、位运算赋值运算符、位移运算符和位字段的定义。通过具体的代码示例和输出结果,展示了如何在C语言中进行高效的位级操作。 阅读详情

相关推荐

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

简单光学 2034

C语言位操作详解(全网最全)

综述 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。运位算包括位逻辑运算和移位运算,位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。 计算机内部是以补码形式存放数值的。 c语言中存在6个位操作运算符,且它们只能用于整形操作数。 位操作符 名称 & 按位与 | 按位或 ^ 按位异或 << 按位左移 >&

qq_41854911的博客 4万+

AvFrame和AvPacket

在FFmpeg中,未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存;针对视频编码器,其流程为从数据源获取图像格式的输入数据,保存为AVFrame对象并传入编码器,从编码器输出AVPacket结构。

Lce的专栏 3236

取模运算法则,异或运算法则

一.取模运算法则(百度百科) 定义 给定一个正整数p,任意一个整数n,一定存在等式 : n = kp + r ; 其中 k、r 是整数,且 0 ≤ r < p,则称 k 为 n 除以 p 的商,r 为 n 除以 p 的余数。 对于正整数 p 和整数 a,b,定义如下运算: 取模运算:a % p(或a mod p),表示a除以p的余数。 模p加法: ,其结果是a+b算术和除以p的余数。 模...

北方的水手,依靠北斗星及北极星来判断正北方向, 1万+

保姆级教程:在RK3588平台上为IMX415 Sensor配置HDR2曝光(附完整代码与避坑点)

本文提供RK3588平台上为IMX415 Sensor配置HDR2曝光的详细教程,涵盖基础概念、限制条件、实战配置步骤及常见问题解决方案。通过完整代码示例和关键参数解析,帮助开发者高效实现HDR2曝光模式,提升图像质量并避开常见陷阱。

weixin_28685287的博客 283

Python爬虫实战:高效爬取Vimeo高清视频

在当今数字化时代,视频内容已成为互联网的重要组成部分。Vimeo作为一个高质量的视频分享平台,拥有大量优质视频资源。然而,Vimeo并未提供直接下载视频的选项,因此,我们需要借助Python爬虫技术来获取这些高清视频。(HTTP Live Streaming)格式存储。Vimeo的视频通常不会直接暴露。Vimeo的视频通常以。

2201_76125261的博客 431

了解C语言中的位运算技巧和位操作函数

通过灵活运用位操作符号和函数,可以实现更高效的算法和数据结构,提升程序的性能和效率。希望本文对您理解C语言中的位运算技巧和位操作函数有所帮助,同时也希朝这些技巧能够在您的编程实践中发挥作用。通过对二进制位的操作,程序员可以实现一些高效的算法和数据结构,提升程序的性能和效率。本文将介绍C语言中的位运算技巧和常用的位操作函数,探讨它们的应用场景和优势。当n & 1的结果为1时,说明n为奇数。比如在图像处理、加密算法、网络编程等领域,位操作技巧可以帮助程序员更高效地实现复杂的逻辑操作,提升程序的性能和响应速度。

2401_83158334的博客 544

Claude Code 100个真实案例 - 用AI搭建GIS地理信息系统(地图标注+热力图)

本案例展示如何使用 Claude Code 从零搭建一个完整的 GIS 地理信息系统。我们将使用 Python + Flask 作为后端,Leaflet.js 作为前端地图引擎,实现地图标注、热力图展示、区域绘制、坐标搜索等功能。全程通过与 Claude Code 对话完成,让你感受 AI 在地理信息领域的强大开发能力。

yueyeguzhuo的专栏 113

C语言 | 位操作的一些技巧

使用手机查看的排版方式:http://mp.weixin.qq.com/s?__biz=MzU5MzcyMjI4MA==&amp;amp;mid=100000874&amp;amp;idx=1&amp;amp;sn=c6d35fd4febd9f46d010132a721c8847&amp;amp;chksm=7e0d6aad497ae3bb7a19ed49a95c7151b7905c5ceaf6e7b9c05f6a35fb26...

嵌入式大杂烩 2767

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版)

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版),OpenCode技能安装与使用指南,分为四个步骤:1)准备Windows服务器环境并确认OpenCode可用;2)通过Git或直接下载方式获取Skill;3)配置技能路径至.opencode/config.json;4)运行测试技能。关键点包括路径配置必须使用双反斜杠、确保Python环境正确安装、管理员权限运行等。文中提供了文本总结技能的完整案例,从创建skill.yaml和main.py到注册运行的全流程,并针

专注于编程、AI、人工智能等多个领域内容研究和分析 1080

西门子PLC编程之⑦编程开始之点位配置及注释

紧接上篇,点位梳理后,进入PLC编程。1、新建工程,配置系统模块2、配置I点并做中文符合,直接上中文,smart支持中文点位编程,用起来很方便。3、配置Q点并做中文符合5、配置AIW模拟量输入点,配置AQW模拟量输出点并做中文符合6、配置手动启动辅助触点,并做中文符合7、 配置自动启动辅助触点,并做中文符合8、 配置传感器浮点型数据变量点位,并做中文符合9、配置系统运行参数设置区点位,做中午符合,做掉电保持.....................

学技术,人生不误——谁也是寂寞宇宙里的流星,只是你的坚持决定了你划过的痕迹。而且,铸造了普遍里的你的唯一。 4889

C语言--位操作符中的一些小技巧

在C语言中,每当提起位操作符时可能对于一部分老铁来说可能会有点懵逼,因为位操作符是用来操作二进制序列的,二进制会比较麻烦。但是如果我们去思考研究二进制,那么问题就会迎刃而解,接下来我就分享一些关于位操作符的一些小技巧吧。 看一个例题,写一个函数,返回参数15二进制序列中1的个数: 1.第一种解法 我们知道整形数据是以二进制补码存在计算机中的,而正数的原反补码都是相同的,所以15在计算机中的存储形式就是00000000000000000000000000001111。如何得出1的个数呢?对15和1进..

w_z_j 368

斯坦福大学3D点云模型下载

本文整理了斯坦福大学10个经典的点云(pcd)及其模型(ply),方便日后使用,欢迎免费下载!

孙悟空 7733

C语言位操作符详解与技巧

C语言提供了6种位操作符,包括按位与(&)、或(|)、异或(^)、取反(~)以及左移(<<)和右移(>>)。这些运算符直接对整数的二进制位进行操作,常用于掩码处理、位设置、交换变量等场景。位操作具有高效性但可能影响代码可读性,使用时需注意数据类型限制和移位操作的边界情况。典型应用包括奇偶判断、变量交换、取绝对值等位运算技巧。

2301_81451531的博客 305

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c语言编程技巧之联合体位操作

1. 联合体介绍 联合体:共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。利用这样的特性我们可以进行很方便的位操作 2. 代码展示 #include<stdio.h> //num和byte公用一片内存 typedef union { char num; struct{ char bit0:1; //位域操作 char bit1to6:6; char bit7:1; }byte; }Num_t; in

Hallo_ween的博客 1572

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C语言位操作技巧

C语言位操作 2017年06月04日 16:51:00 阅读数:1553 此文将花费您8~15分钟时间,带您对嵌入式中常用的位操作有个了解。和数字电路有点相似!感谢阅读! 位操作符 1.位与&amp; 1、注意:位与符号是一个&amp;,两个&amp;&amp;是逻辑与。 2、真值表:1&amp;0=01&amp;1=10&amp;0=00&amp;1=0 3、从真值表可以看出:位...

qq_38373037的博客 774

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言位操作技巧与应用场景详解

通过定义不同的权限位,可以快速实现权限的添加和移除。比如用二进制111表示读写执行权限,通过与特定掩码的运算,就能精确控制每个权限位的开关状态。我在实际使用时发现,其即时预览功能能直观展示二进制运算过程,比本地开发更便于调试位操作相关的边界情况。右移对有符号数要特别注意算术位移和逻辑位移的区别,不同编译器可能有不同实现。比如实现一个高效的整数绝对值函数,就可以利用补码特性和位运算:(x + (x >> 31)) ^ (x >> 31)。这种直接操作二进制位的技术,能够实现许多高效且巧妙的功能设计。

SunstoneOwl39的博客 429

嵌入式、C语言位操作的一些技巧汇总

下面分享关于位操作的一些笔记: 一、位操作简单介绍 首先,以下是按位运算符: 在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作。下面进行举例说明,假如有一个8位的TEST寄存器: 当我们要设置第0位bit0的值为1时,可能会这样进行设置: TEST = 0x01; 但是,这样设...

weixin_44626952的博客 471

[总结] C语言的位操作技巧

<br />置位<br />   #define BIT3 (0x1 << 3)<br />   static int a;<br /> void set_bit3(void) <br />   {<br />   a |= BIT3;<br />   }<br /> void clear_bit3(void) <br />   {<br />   a &= ~BIT3;<br />   }<br /> 判断位是否为1 if (a & BIT3)<br />nt a|=(1

性情中的小完熊 1042

【C语言】位操作符的一些题目与技巧

在遇到数字重复时,二进制时,计算时,可能会有操作符的做法遇到不会做的题很正常,不要感到沮丧,要知道我们也是站在巨人的肩膀上才能看得更远。

2301_78636079的博客 577

C语言中的位操作使用技巧

lwf666888的专栏 328

c语言 t自己设置跳跃位置,[总结] C语言的位操作技巧

置位#define BIT3 (0x1 << 3)static int a;void set_bit3(void){a |= BIT3;}void clear_bit3(void){a &= ~BIT3;}判断位是否为1 if (a & BIT3)nt a|=(1<int b&=~(1<x=x|0x0100 //把第三位置1x=x&am...

weixin_30068377的博客 439

c语言 ^ 端口 定义_C语言、嵌入式位操作精华技巧汇总

分享关于位操作的一点小笔记:一、位操作简单介绍首先,以下是按位运算符:在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作。下面进行举例说明,假如有一个8位的TEST寄存器:当我们要设置第0位bit0的值为1时,可能会这样进行设置:TEST = 0x01; 但是,这样设置是不够准确的,因为这时候已...

weixin_39729262的博客 801

c位下怎样编辑c语言程序,C/C++中的位操作的技巧

【说明:本文参考了网上相关内容,做了补充和修改。】C++中的位操作包括两种:传统的C语言方式的位操作和C++中利用bitset容器进行的位操作。****** 一、传统的C方式位操作:******1.基本操作:使用一个unsigned int变量来作为位容器。2.位操作符:|:按位或操作,result = exp1 | exp2;当exp1和exp2中对应位中有一个为1时,则result中对应位为1...

weixin_39622289的博客 189
上一篇: GNU/Linux下库机制笔记
下一篇: 龙芯2E体系结构之异常、中断
LonlyGod
博客等级 码龄15年 32粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值