`
wgcode
  • 浏览: 599800 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

自定义BitArray

 
阅读更多

package com.riaoo.utils
{
        import flash.utils.ByteArray;
        
        /**
         * 支持位访问的 ByteArray 子类。
         * @author Y.Boy
         * 
         */     
        public class BitArray extends ByteArray
        {
                /**
                 * 构造函数。可传递一个 ByteArray 对象进行初始化。
                 * @param bytes 现有的 ByteArray 数据。
                 * 
                 */             
                public function BitArray(bytes:ByteArray = null)
                {
                        if (bytes != null)
                        {
                                this.writeBytes(bytes, 0, bytes.length);
                        }
                }
                
                /**
                 * 返回位长度。bitLength = ByteArray.length * 8 。
                 * @return 
                 * 
                 */             
                public function get bitLength():uint
                {
                        return this.length * 8;
                }
                
                /**
                 * 返回由参数 index 指定位置处的位的值。1 为 true,0 为 false 。
                 * @param index 一个整数,指示位在 ByteArray 中的位置。第一个位由 0 指示,最后一个位由 BitArray.length * 8 - 1 指示。
                 * @return 指示索引处的位的值。或者,如果指定的索引不在该 ByteArray 的索引范围内,会抛出 RangeErroe 错误,并返回 false 。
                 * 
                 */             
                public function getBitAt(index:uint = 0):Boolean
                {
                        index++; // 索引值加 1 ,计算出长度
                        
                        if (index > this.length * 8)
                        {
                                throw new RangeError("数值不在可接受的范围内。可接受范围为:0 到 ByteArray.length*8-1 。");
                                return false;
                        }
                        
                        var byteIndex:uint = Math.ceil(index/8) - 1; // 目标字节的索引
                        var flag:uint = 1 << (this.length * 8 - index) % 8; // 计算标志位
                        
                        return Boolean(this[byteIndex] & flag);
                }
                
                /**
                 * 设置由参数 index 指定位置处的位的值。如果 index 指定位置处的长度大于当前长度,该字节数组的长度将设置为最大值,右侧多出的位将用零填充。
                 * @param index 一个整数,指示位在 ByteArray 中的位置。第一个位由 0 指示,最后一个位由 BitArray.length * 8 - 1 指示。
                 * @param value 要设置的值。true 为 1 ,false 为 0 。
                 * 
                 */             
                public function setBitAt(index:uint, value:Boolean):void
                {
                        index++; // 索引值加 1 ,计算出长度
                        
                        // 如果 index 指定位置处的长度大于当前长度,该字节数组的长度将设置为最大值,右侧多出的位将用零填充。
                        var len:uint = Math.ceil(index/8);
                        if (len > this.length)
                        {
                                this.length = len;
                        }
                        
                        var byteIndex:uint = Math.ceil(index/8) - 1;
                        var flag:uint = 1 << (this.length * 8 - index) % 8; // 计算标志位
                        if (value)
                        {
                                this[byteIndex] |= flag; // 设置位,即赋值 1
                        }
                        else
                        {
                                this[byteIndex] &= ~flag; // 取消位,即赋值 0
                        }
                }
                
                /**
                 * 获取指定坐标处的值,x 轴方向的长度由 lengthX 指定。
                 * @param lengthX x 轴方向上的长度。
                 * @param x x 坐标。
                 * @param y y 坐标。
                 * @return 指定坐标处的值。
                 * 
                 */             
                public function getBitAtCoord(lengthX:uint, x:uint, y:uint):Boolean
                {
                        var i:uint = y * lengthX + x;
                        return this.getBitAt(i);
                }
                
        }
}
 
分享到:
评论

相关推荐

    70-536 题库 2/2

    D选项的`BitArray answers = new BitArray(25)`创建了一个存储25个位的位数组,每个位代表一个问题的答案,且初始值均为`false`(默认),符合题目要求的预置为“是”(可以之后进行修改)以及内存效率的要求。...

    基于位图的n选m的组合算法实现(C#)

    本项目是基于C#语言实现的n选m组合算法,能够处理各种类型的数据,包括数字、字符串甚至是自定义的对象。下面我们将深入探讨这个算法的实现原理和C#中的关键概念。 首先,组合算法的核心思想是无序性,即选取的m个...

    微软C#认证

    为了实现这点,可以使用BitVector32或BitArray类型,这些类型可以使用少量的内存来存储大量的布尔值。因此,正确的答案是B:BitVector32 answers = new BitVector32(-1)。 在微软C#认证中,考察了开发人员在使用C#...

    python使用布隆过滤器的实现示例

    【布隆过滤器详解】 布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。...在Python中,我们可以通过`pybloom_live`这样的库轻松地使用布隆过滤器,也可以根据需要自定义实现。

    一点绑定-MVVM'ing基于字节/位的数据

    但是,BitArray类是.NET框架中处理位数组的类,文档可能会讨论如何将BitArray与ObservableCollection结合,以适应MVVM的数据绑定机制。 4. **自定义转换器**:由于位和字节数据可能不直接与UI元素兼容,因此可能...

    LDFD-BloomFilter-master.zip

    在这个项目中,可能使用了如bitarray这样的库来创建和操作位数组,以及自定义的哈希函数或现有的哈希模块如hashlib。 4. **False Negatives的避免**:在LDFD-BloomFilter的实现中,可能会使用多个独立的Bloom ...

    sfs的数据结构

    《sfs的数据结构》一书详细介绍了基于`DictionaryBase`类创建自定义字典类的方法。散列表是一种利用哈希函数实现高效查找的字典实现方式,`HashTable`类便是.NET框架中实现散列表的一个例子。 #### 十、链表与...

    VB2010从入门到精通.docx

    VBA(Visual Basic for Applications)则是VB的一个变种,常用于在Microsoft Office套件中编写宏和自定义功能。 在VB2010中,了解常用命名空间和类对于深入学习和应用至关重要。以下是一些关键的命名空间及其包含的...

    C#关于System.Collections空间详解

    2. **BitArray**:这个类提供了一种存储和操作位集合的方式,适合处理位运算或存储大量布尔值的情况。BitArray是基于数组的,可以通过索引访问和修改单个位。 3. **Queue**:队列是一种先进先出(FIFO)的数据结构...

    数据结构与算法:C#_语言描述(中文)

    第九章至第十章介绍了字典数据结构的使用和实现,包括基于DictionaryBase类的自定义类创建,以及散列表和HashTable类的深入探讨,展示了数据作为键/值对存储的灵活性和效率。 第十一章至第十五章依次探讨了链表、...

    比较入门的C#数据结构及算法

    - **字典**:一种将数据作为键/值对存储的数据结构,介绍如何创建基于DictionaryBase类的自定义字典类。 ##### 10. **第10章:散列表** - **散列表**:一种高效的查找数据结构,使用散列算法来快速定位数据。 ###...

Global site tag (gtag.js) - Google Analytics