首页 / C语言 / C语言位段的应用:统计二进制的位数
C语言位段的应用:统计二进制的位数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C语言位段的应用:统计二进制的位数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1988字,纯文字阅读大概需要3分钟。
内容图文
![C语言位段的应用:统计二进制的位数](/upload/InfoBanner/zyjiaocheng/1277/7199b04d6cfe440e8f6e4e16c34f1083.jpg)
位段是C语言中使用较少的一种特殊的结构体,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。
struct packed-data { unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; int i; }data;其内存分配的结构如下所示
利用位段结构体,可以实现数据的统计信息。
参考题目:1的个数
题目分析,本题很显然就是要求统计输入整数的1的个数问题,当然,这题也可以使用位运算进行统计,在这里,我们使用位段进行结题。
可知,输入的数据N<=1000<2^16,所以设计16位的结构体位段
typedef struct A { unsigned short a0:1; unsigned short a1:1; unsigned short a2:1; unsigned short a3:1; unsigned short a4:1; unsigned short a5:1; unsigned short a6:1; unsigned short a7:1; unsigned short a8:1; unsigned short a9:1; unsigned short a10:1; unsigned short a11:1; unsigned short a12:1; unsigned short a13:1; unsigned short a14:1; unsigned short a15:1; }DATATYPE;
为每一个位取一个名字ai 0<=i<16
接着,就想办法将整数转换到位段中去,直接赋值肯定是错的,使用每一位赋值,要求用到位运算,复杂而为容易出错,这里,我们要使用一个内存拷贝函数memcpy(void*,void*,size_t)
其实无论是结构体、数组、还是int变量,归根结底还是要在内存中连续表示,memcpy函数能实现数据得拷贝,是基于内存级别的。
参考源码:
#include <memory.h> #include <iostream> using namespace std; #define sums(b) b.a0+b.a1+b.a2+b.a3+b.a4+b.a5+b.a6+b.a7+ b.a8+b.a9+b.a10+b.a11+b.a12+b.a13+b.a14+b.a15 typedef struct A { unsigned short a0:1; unsigned short a1:1; unsigned short a2:1; unsigned short a3:1; unsigned short a4:1; unsigned short a5:1; unsigned short a6:1; unsigned short a7:1; unsigned short a8:1; unsigned short a9:1; unsigned short a10:1; unsigned short a11:1; unsigned short a12:1; unsigned short a13:1; unsigned short a14:1; unsigned short a15:1; }DATATYPE; int main(int argc ,char** argv) { DATATYPE p; int c; int n; //scanf("%d",&n); cin>>n; while(n) { unsigned short b; n--; cin>>b; memcpy(&p,&b,sizeof(short)); c=sums(p); cout<<c<<endl; } return 0; }
原文:http://blog.csdn.net/u011889952/article/details/44860845
内容总结
以上是互联网集市为您收集整理的C语言位段的应用:统计二进制的位数全部内容,希望文章能够帮你解决C语言位段的应用:统计二进制的位数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。