我是靠谱客的博主 怕孤单皮带,最近开发中收集的这篇文章主要介绍C语言位段的应用:统计数据二进制格式中1的个数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

位段是C语言中使用较少的一种特殊的结构体,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。

信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,“真”或“假”用0或1表示,只需1位即可。在计算机用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进制位,常常在一个字节中放几个信息。
怎样向一个字节中的一个或几个二进制位赋值和改变它的值呢?可以用以下两种方法:
(1)可以人为地将一个整型变量data分为几部分。
但是用这种方法给一个字节中某几位赋值太麻烦。可以位段结构体的方法。
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;
}


最后

以上就是怕孤单皮带为你收集整理的C语言位段的应用:统计数据二进制格式中1的个数的全部内容,希望文章能够帮你解决C语言位段的应用:统计数据二进制格式中1的个数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部