如何实现简单的位数组(bit array)

发布者:心灵清澈最新更新时间:2015-09-09 来源: eefocus关键字:的位数组  bit  array 手机看文章 扫描二维码
随时随地手机看文章
在 comp.lang.c 上面看到一则不错的 FAQ,《How can I implement sets or arrays of bits?》感觉很实用,仅仅使用了几个简单的宏就实现了一个基本的位数组(bitset)。
 
#include "limits.h"
#define BITMASK(b) (1 << ((b) % CHAR_BIT)) 
#define BITSLOT(b) ((b) / CHAR_BIT) 
#define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b)) 
#define BITCLEAR(a, b) ((a)[BITSLOT(b)] &= ~BITMASK(b)) 
#define BITTEST(a, b) ((a)[BITSLOT(b)] & BITMASK(b)) 
#define BITNSLOTS(nb) ((nb + CHAR_BIT - 1) / CHAR_BIT)
 

下面是一些简单的例子:

  • 声明一个固定长度(50个bit)的位数组:
char bitarray[BITNSLOTS(50)];
  • 设置位数组中的某一位:

BITSET(bitarray, 23);
  • 检测某一位
if(BITTEST(bitarray, 35)) ...
  • 求两个位数组的并集
for(i = 0; i < BITNSLOTS(47); i++)
    array3[i] = array1[i] | array2[i];
  • 求两个位数组的交集
for(i = 0; i < BITNSLOTS(47); i++)
    array3[i] = array1[i] & array2[i];

下面是一个完整的例子,利用 Sieve of Eratosthenes 算法求素数:

复制代码
#include 
#include <string.h> 
#define MAX 10000 

int main() 
{ 
        char bitarray[BITNSLOTS(MAX)];
        int i, j;
        memset(bitarray, 0, BITNSLOTS(MAX));
        for(i = 2; i < MAX; i++)
       { 
             if(!BITTEST(bitarray, i))
             { 
                    printf("%d
", i);
                    for(j = i + i; j < MAX; j += i) 
                            BITSET(bitarray, j);
             } 
       }
       return 0; 
}
 
关键字:的位数组  bit  array 引用地址:如何实现简单的位数组(bit array)

上一篇:C语言中字符串操作
下一篇:C语言中char int转换问题

推荐阅读最新更新时间:2024-03-16 14:30

用4BIT OTP单片机实现USB/PS2 MOUSE设计
   引言:   USB  低速设备的设计发展到现在已经有了相当的成熟度。 各家IC公司都推出了USB DEVICE端的解决方案, 一般以8 BIT CPU CORE + USB SIE为主流构架。 SH69P04是中颖电子(Sinowealth)本着丰富USB产品应用,降低USB IC成本而设计的4BIT OTP单片机, 用以开发USB DEVICE设备。   SH69P04的功能及特点                        图1    如图1, SH69P04集成了USB SIE, 支持USB和PS2端口复用。 内建1.5K可控上拉电阻为用户节约成本, 并能建立和PC稳定的通讯。 专门为MOU
[单片机]
第33章 STM32F429SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)
33.1 初学者重要提示 学习本章节前,务必优先学习第31章。 对于DAC8562和DAC8563,教程中不做区分,因为DAC8562和DAC8563完全兼容,区别仅仅在于CLR引脚有效时,DAC8562数据设置为0, DAC8563数据设置为32767。 本章涉及到的知识点比较多,需要大家掌握STM32H7的SPI , DMA,TIM,DMAMUX和DAC8563的一些细节用法。 我们的H7板子配套了SPI + DMA方式控制DAC856X,而F4系列不方便实现,确切的说是可以用DMA方式,但是不方便控制写入速度,需要借助定时器中断进行更新,实用价值不是很大。 DAC856X数据手册,模块原理图和接线图都已经放到
[单片机]
第33章 STM32F429<font color='red'>的</font>SPI总线应用之驱动DAC8563(双通道,16<font color='red'>bit</font>分辨率,正负10V)
S5PV210 nand 4bit ecc笔记与AM335xECC
首先假设flash芯片页大小为2K + 64B的格式。 S5PV210 根据User Manual的4.3.7 4-BIT ECC PROGRAMMING GUIDE (ENCODING) 得知4bitecc的编码步骤为: 1. 写数据之前,设置Msglength(NCONF【25】)设为512,InitMECC(NFCONT )为1,MainECCLock (NFCONT ) 清零,解锁ECC; 2. 写数据时,每写512B, NFMECC0 and NFMECC1产生ECC code(7字节),当写完一页数据(我的nand页大小为2K)时,将ECC写入OOB(28字节)。 解码: 读 懒得写了,自己看代码吧,和8bit ecc
[单片机]
华邦针对SiP市场推出32bit SDR DDR内存
    华邦电子针对系统级封装(SiP)市场,推出最新65奈米制程32bit带宽 32M / 64Mb SDR / DDR 利基型内存。     该产品针对面板后段模块(LCM)、电视用时序控制器(T-con)、监视器用 Scaler 、笔记本电脑摄影镜头(NB cam)、 IP cam 微型投影机(Pico-projector),以及影像讯号处理器(ISP)等应用,能以良晶裸晶圆(KGD)方式提供最佳的系统级封装(SiP)解决方案。     华邦电子专注于利基型内存研发制造,在 KGD 方面具备完整的产品与服务,如自有12吋先进晶圆厂提供最佳成本竞争力与长期出货保证、具备完整仪器与电性物性错误分析能力、在晶圆阶段即提供完
[手机便携]
面向车载内置闪存16bit微控制器正式投产
瑞萨科技正式投产用于汽车车体和底盘等控制用途的内置闪存的16bit微控制器“M16C/Tiny系列”。共有14款产品,将于2008年10月开始样品供货。根据是否配备CAN控制器产品被分为“M16C/5L”和“M16C/56”两组。两组均分别备有80端子和64端子的封装产品。 处理器内核与此前一样采用“M16C60”,最高工作频率为32MHz,速度高达原产品的1.6倍左右。端子配置与原产品具有兼容性,与周边功能具有向上兼容性。内置闪存容量方面,80端子的产品为256/128/96KB,64端子的产品为256/128/96/64KB。由于原产品最大容量为128KB,因此新产品实现了存储程序的大容量化。另外,分别为闪存擦除
[汽车电子]
一种提高遥测信号处理器测试性方法
可测试性定义为:产品能及时准确地确定其状态,隔离其内部故障的设计特性,以提高产品可测试性为目的而进行的设计被称为可测试性设计。可测试性是同可靠性、维修性相并列的一门新型学科,其发展和应用对于提高产品的质量,降低产品的全寿命周期费用具有重要意义。随着集成电路设计方法与工艺技术的不断进步,集成电路的可测性已经成为提高产品可靠性和成品率的重要因素。文中针对遥测产品中信号处理器的设计原理,通过增加BIT以提高信号处理器的测试覆盖率。 1 信号处理器简介 硬件电路软件化是电路设计的发展趋势。借助大规模集成的FPGA和高效的设计软件,不仅可通过直接对芯片结构的设计实现多种数字逻辑系统功能,而且由于管脚定义灵活,从而减轻了信号处理器电
[测试测量]
一种提高遥测信号处理器测试性方法
c51 bit使用
如i=0时,tab 的值为0x3f,那么这句bit_dat((bit)(tab &0x80));的作用是: 第一步:tab 与0x80作位与,即0x3f与0x80作位与(与0x40相位与就是取了第6位),这样的效果是取得了0x3f的最高位(第7位),其它位全部被屏蔽为0 第二步:作int向bit强制转换,向bit转换有一个规则,只要待转换前变量是非零,转换后的bit类型变量即为1,否则为0,这里,0x3f&0x80的结果为0,也就是((bit)(tab &0x80))的结果为0 第三步:调用bit_dat函数,向外设写入这一位。 后面的(bit_dat((bit)(tab &0x40))句子就是取次高位,后面的依此类推,就可以从高
[单片机]
cortex M3权威指南之带(Bit Band)操作
位带操作 概念其实30年前就有了,那还是 8051 单片机开创的先河。如今CortexM3 将此能力进化,这里的位带操作是8051 位寻址区的威力大幅加强版。 概念: 位带操作 就是指可以使用普通的加载/存储指令来对单一的比特(bit)来进行读写。打个比喻,就相当于是为位带区的每一位都起了一个别名,或者说是为为带区的每一位新建了一个快捷方式,通过对指定别名的访问来代替对指定位的访问。说明:指定位与别名之间的映射过程是由内核完成的,无需人工干预。 为了能使用普通指令来加载和存储那么这个别名肯定得膨胀成32位(一个字),不过这个32位只有低位有效。所以这样就可以通过对别名的访问来代替对位带区指定位的访问了。 位带区 :支持
[单片机]
cortex M3权威指南之<font color='red'>位</font>带(<font color='red'>Bit</font> Band)操作
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved