一种存储数据的方法

  写程序就是和逻辑和数据打交道,说的简单一点就是和数据打交道。说到数据,数据的存储当然是很重要的。

  数据存储也是有一定的方法,在平常中,我们会用到int型来存储数据,或者bool型(C语言中没有,char型)来存储表示0,1的flag。有时候想想,如果只是简单的存储true和false的话,对于unsigned char型来说是否过于浪费了?信息论告诉我们,1bit数据就可以表示true和false,为什么不能将其存到1bit中?

  那么,现在,我们开始将数据压缩。

  如果有8个这样的数据,我们可以存在一个char型中,也就是uint8中。

  bit0-bit7,每一个位都可以表示2个信息。那么就可以表示8种完全互不影响的标志。至于要表示什么,完全可以由“规则”来定。

  假设,表示flag的数据很多?该如何做?

  一个简单的方式:如果有n个标志,那么有

  uint8 a[n];

  这里,我们采用另外的一种方式。

  uint8 a[m],其中m = n / 8;

  那么,看到8倍这个数据,是不是一下子节省了很多?

  对数据做计算的时候,"/"(除法)显然是要尽量避免的,虽然说是有那么简单,但是对于CPU来说可就不简单了。所以我们这里采用移位的方式。

  即:m = n >> 3

  那么如何去索引到某一个位呢?

  很显然,用某一个0-7的数据将其存起来。

  所以,去对某一个数据写数据需要两个信息,在第M个数组元素上,要写第X个bit位。很容易的会想到,封装一个函数,第一个参数为第几个数组元素,第二个参数为第几个位,第三个参数写入在该位上要写入的值。

  即:

 1 int func(int a,int b,int c)
 2 {
 3     if(c == 0)
 4     {
 5         gs_arg[a] &= ~(1 << b);
 6     }
 7     if(c == 1)
 8     {
 9         gs_arg[a] |= (1 << b);
10     }
11 }

  以上这种方式,实现起来应该没有什么难度。不过,在对a值计算,对b值限定的时候,都会存在一系列的问题。那么我们何不采用另外的方式来解决这个问题呢?

  对于上面提到的m = n >> 3应该表示没有异议吧。对于追求极致的人来说,为什么要把n的最后3位丢掉,这3位可以表示8个信息啊。

  等等,你说什么?移位丢掉的数据可以表示8个信息,你的意思是可以表示0,1,2,3,4,5,6,7?这个问题是显然的。可以表示。

  等等,我好像想到了什么!这样可以解决一些列的问题,不过也会带来另外的问题。

  是的,可以通过丢弃的3位来表示写入数据的位数。用剩余的位的数据来表示数组的第几个元素。

  那么,可以有如下的函数:

  

int func_md(int a,int b)
{
    int ord;
    int s_bit;

    ord = a >> 3;
    s_bit = a & 0x07;
    s_move = 0x01 << s_bit;

    if(b == 0)
    {
        gs_arg[ord] &= ~s_move;
        //或者gs_arg[ord] &= s_move ^ 0xFF;
    }

    if(b == 1)
    {
        gs_arg[ord] |= s_move;
    }
}

  当然,为了满足很多规范,是需要做一些强制转换的限定的,同时传入的参数也存在一定的类型问题,这个在这里就不再那么规范了,表示意思即可。

  

  

时间: 2024-10-15 13:00:06

一种存储数据的方法的相关文章

iOS开发中存储数据的方法

最近被问到一些关于iOS开发中对于数据存储的处理方式,感觉数据存储这个也是经常用到的一个功能的,有必要自己去整理和记录一下的. iOS开发中一般是有四种存储数据的方式,分别是: 1.NSUserDefaults:用来保存用户自己设置的一些属性,用户再次打开程序,或者开机后,这些信息还是存在,NSUserDefaults可以存储的类型包括NSString,NSData,NSNumber,NSDictionary,NSArray.如果要存储其他的数据类型,则需要转化为前面的一些类型,NSUSerDe

android开发中的5种存储数据方式

数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstance State保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整

Web Storage 提供的客户端存储数据的方法

包括localStorage和sessionStorage.他们都只能读写当前域的数据,区别是,localStorage存储的数据不会过期,sessionStorage存储的数据每次关闭浏览器后都会被清空. ps: 现在很多浏览器都提供了“匿名访问”,“安全模式”,“隐身窗口”等等功能.在这种情况下,浏览器都是会重新建立一个新的localStorage,所以这些模式下的页面是没法访问在正常模式下的页面中的数据. 曾经,Firefox支持globalStorage:能读写所有域的存储数据的loca

cocos2d-x中几种存储数据的方式

说明:本文所论述内容均基于cocos2dx 3.0 版本. 1.UserDefault 它是cocos2d-x用来存取基本数据类型用的.保存为XML文件格式. 查看CCUserDefault文件,可以看出,文件名默认为UserDefault.xml.在win32平台,Debug下,该文件在Debug.win32文件夹内.如果该文件不存在,则会创建新文件. 1 // root name of xml 2 #define USERDEFAULT_ROOT_NAME "userDefaultRoot&

用C#实现的几种常用数据校验方法整理(CRC校验;LRC校验;BCC校验;累加和校验)

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性.         /// CRC算法参数模型解释:         /// NAME:参数模型名称.         ///WIDTH:宽度,即CRC比特数.         /// P

Kotlin安卓页面本地存储数据(方法和封装)

直接上代码 封装: 1 //存储key对应的数据 2 fun saveData(context: Activity, key: String, info: String) { 3 val sharedPreferences = context.getSharedPreferences(key, MODE_PRIVATE) 4 val editor = sharedPreferences.edit() 5 editor.putString(key, info) 6 editor.apply() 7

6.Request的三种获取数据的方法

其实一共有4种,不过form这种专门获取以post方式提交数据的方式目前还没学.所以就不太演示了 另外需要注意的是,Request.params 这种获取方式能不用就不要用了,有时候会出问题 那么代码如下: 第一个页面是index.aspx的代码: 第一个页面的index.aspx.cs的代码: 这里要说一下,上面这行语句,我在问号后面多打了一个空格,结果运行的时候就报错了!!!说没找到页面! 第二个页面的test.aspx.cs的代码: 原文地址:https://www.cnblogs.com

[安卓基础]010. 存储数据(上)

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin

8.7 JSON存储数据方式(JavaScript对象表示法)

JSON JavaScript 对象表示法(JavaScript Object Notation) 是一种存储数据的方式. 一.创建JSON对象 var gareen = {"name":"盖伦","hp":616}; 这样就创建了一个JSON 对象 JSON对象由 名称/值对组成 名称和值之间用冒号:隔开 名称必须用双引号" 包含起来 值可以是任意javascript数据类型,字符串,布尔,数字 ,数组甚至是对象 不同的名称/值对之间