我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 2190|回复: 38

[技术文章] C语言位操作源码分享

[复制链接]

该用户从未签到

5

主题

4

回帖

0

积分

一级逆天

积分
0

终身成就奖

发表于 2020-8-14 17:32:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
#include <stdio.h>#include <stdlib.h>
#include <string.h>
typedef struct
{
char BIT0:1;
char BIT1:1;
char BIT2:1;
char BIT3:1;
char BIT4:1;
char BIT5:1;
char BIT6:1;
char BIT7:1;
}BYTE_BIT;
typedef struct
{
char BIT0:1;
char BIT1:1;
char BIT2:1;
char BIT3:1;
char BIT4:1;
char BIT5:1;
char BIT6:1;
char BIT7:1;
char BIT8:1;
char BIT9:1;
char BIT10:1;
char BIT11:1;
char BIT12:1;
char BIT13:1;
char BIT14:1;
char BIT15:1;
}WORD_BIT;
typedef struct
{
char BIT0:1;
char BIT1:1;
char BIT2:1;
char BIT3:1;
char BIT4:1;
char BIT5:1;
char BIT6:1;
char BIT7:1;
char BIT8:1;
char BIT9:1;
char BIT10:1;
char BIT11:1;
char BIT12:1;
char BIT13:1;
char BIT14:1;
char BIT15:1;
char BIT16:1;
char BIT17:1;
char BIT18:1;
char BIT19:1;
char BIT20:1;
char BIT21:1;
char BIT22:1;
char BIT23:1;
char BIT24:1;
char BIT25:1;
char BIT26:1;
char BIT27:1;
char BIT28:1;
char BIT29:1;
char BIT30:1;
char BIT31:1;
}DWORD_BIT;
#define BYTE_SET_BIT(addr, b) ((BYTE_BIT*)addr)->b = 1
#define BYTE_CLR_BIT(addr, b) ((BYTE_BIT*)addr)->b = 0
#define WORD_SET_BIT(addr, b) ((WORD_BIT*)addr)->b = 1
#define WORD_CLR_BIT(addr, b) ((WORD_BIT*)addr)->b = 0
#define DWORD_SET_BIT(addr, b) ((DWORD_BIT*)addr)->b = 1
#define DWORD_CLR_BIT(addr, b) ((DWORD_BIT*)addr)->b = 0
/*
1. C语言中位操作的方法很多,只要写的执行效率跟按位与,按位或一样就行了,三条汇编指令搞定,
   有些习惯用按位与加按位取反来清除某一位的,效率还没以上的方法来的快。
2. 这样的定义方便在寄存器操作中对某位给特定的名称,也适合不支持位寻址的内存变量的访问,让程序可读性提高。
   例如在不支持sbit关键字的环境下,可以给要操作的位取个名称,如 #define INT_ENABLE BYTE_SET_BIT(0xA8, BIT7);
3. 适合程序中需要用到标志位的地方,让标志位不占额外的内存空间,并且可读性好,移植性好,易扩展。
4. 这套程序有两种用法,一种是像下面例程这样,另一种是你定义一个普通变量比如 short a; 然后通过宏来进行位操作,或者强制转化为上面的位结构类型,使用很灵活。
*/
int main(int argc, char *argv[])
{
BYTE_BIT a = {0};
WORD_BIT b = {0};
DWORD_BIT c = {0};
BYTE_SET_BIT(&a, BIT5); //a.BIT5 = 1
BYTE_SET_BIT(&a, BIT3); //a.BIT3 = 1;
WORD_SET_BIT(&b, BIT10);
WORD_SET_BIT(&b, BIT15);
DWORD_SET_BIT(&c, BIT20);
DWORD_SET_BIT(&c, BIT25);
printf("a=%#x, b=%#x c=%#x\n", a, b, c);
BYTE_CLR_BIT(&a, BIT5); //a.BIT5 = 0;
BYTE_CLR_BIT(&a, BIT3); //a.BIT3 = 0;
WORD_CLR_BIT(&b, BIT10);
WORD_CLR_BIT(&b, BIT15);
DWORD_CLR_BIT(&c, BIT20);
DWORD_CLR_BIT(&c, BIT25);
printf("a=%#x, b=%#x c=%#x\n", a, b, c);
}
回复

使用道具 举报

  • TA的每日心情
    慵懒
    2024-6-14 16:03
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    0

    主题

    1万

    回帖

    7618

    积分

    二级逆天

    积分
    7618

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-8-14 18:02:07 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    12

    主题

    7222

    回帖

    5073

    积分

    二级逆天

    积分
    5073

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-8-14 20:07:37 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    87

    主题

    1136

    回帖

    2478

    积分

    PADS-241024高级班

    积分
    2478

    终身成就奖

    发表于 2020-8-16 20:46:16 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    87

    主题

    1136

    回帖

    2478

    积分

    PADS-241024高级班

    积分
    2478

    终身成就奖

    发表于 2020-8-21 22:51:17 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    9

    回帖

    0

    积分

    一级逆天

    积分
    0

    终身成就奖

    发表于 2022-3-15 14:13:00 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-10-4 20:48
  • 签到天数: 1 天

    [LV.1]初来乍到

    8

    主题

    3253

    回帖

    2669

    积分

    二级逆天

    孤独的奔跑者

    积分
    2669

    终身成就奖社区居民

    QQ
    发表于 2022-3-30 08:36:00 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    18

    回帖

    0

    积分

    一级逆天

    积分
    0

    终身成就奖

    发表于 2022-4-2 09:12:20 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    33

    主题

    1427

    回帖

    1862

    积分

    二级逆天

    积分
    1862

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2022-5-27 12:33:10 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-12-20 08:42
  • 签到天数: 96 天

    [LV.6]常住居民II

    0

    主题

    467

    回帖

    782

    积分

    二级逆天

    积分
    782

    终身成就奖特殊贡献奖

    发表于 2022-6-2 09:01:11 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表