1

所以我正在上暑期 OO 课程,明天我们将围绕这个项目进行测试。基本上,我们需要创建一个包含未指定位数的数组,并编写四个对该数组执行操作的函数- Set() //set bit with given index to 1、和。Unset() //set bit with given index to 0Flip() // change bit (with given index)Query() // return true if the given bit is set to 1, false otherwise

如果有人感兴趣,这里有一个完整的描述:http: //pastebin.com/v7BCCYjh和一些示例运行: http: //pastebin.com/1ijh5p7p

我遇到的问题是高级概念。我很确定我们打算在数组的每个索引中存储位的字节表示。如果这是真的,那么我完全不知道如何实现这些功能。如果有人能给我一些关于如何解决这个问题的指示(我需要在今晚之前对它有一个很好的理解,因为我必须为明天的期中写一些伪代码)我会非常非常感激。

.h如果有帮助,这是我的

//   bitarray.h
//
//   BitArray class declaration

#ifndef _BITARRAY_H
#define _BITARRAY_H

#include <iostream>
using namespace std;

class BitArray
{
   friend ostream& operator<< (ostream& os, const BitArray& a);
   friend bool operator== (const BitArray&, const BitArray&);
   friend bool operator!= (const BitArray&, const BitArray&);

public:
   BitArray(unsigned int n);    // Construct an array that can handle n bits
   BitArray(const BitArray&);   // copy constructor
   ~BitArray();                 // destructor

   BitArray& operator= (const BitArray& a);  // assignment operator

   unsigned int Length() const;            // return number of bits in bitarray

   void Set   (unsigned int index);        // set bit with given index to 1
   void Unset (unsigned int index);        // set bit with given index to 0
   void Flip  (unsigned int index);        // change bit (with given index)
   bool Query (unsigned int index) const;  // return true if the given bit
                       //  is set to 1, false otherwise

private:
   unsigned char* barray;          // pointer to the bit array
   int arraySize;
};

#endif

还有我的构造函数:

BitArray::BitArray(unsigned int n){
    int size = sizeof(char);

    if(n%(8*size) != 0)
        arraySize = ((n/(8*size))+1);
    else
        arraySize = n/(8*size);

    barray = new unsigned char[arraySize];

    for(int i = 0; i < arraySize; i++)
        barray[i] = 0;

}
4

2 回答 2

2

对于Set()Query(),找到包含您感兴趣的位的单词的位置。(您的代码似乎char用作单词。)然后,找到该位在该单词中的位置。创建一个寻址特定位的位掩码,您将需要一个移位运算符。回想一下最终将帮助您完成工作的位运算符。有时按位赋值运算符会更优雅。

你还记得 C++ 中的按位异或运算符吗?将此与从中学到的概念Set()一起实施Flip()。使用按位否定运算符最终实现Unset().

请注意,您确定数组大小的方法过于复杂。回想一下,ceil(a/b) == floor((a+b-1)/b)在这里可能发生的情况。

std::vector如果允许,请考虑使用而不是普通数组。以下剧透!

这门课还有一个有趣的专业。

通过将您的班级变成一个模板来给您的老师留下深刻印象,您可以在其中指定实际的存储单元 ( char, uint16_t, ...) 作为参数。对于初学者来说,typedef char WORD_TYPE当您更改WORD_TYPE.

于 2012-07-11T23:47:51.377 回答
0

您可以将整数数组视为位数组。

说,你有一个数组A = [0xC30FF0C3, 0xC20FF0C3],你想访问53。少量。您可以找到包含53
的 an 的索引。bit doing which is和在 that doing中的位位置,即 21。intfloor(53 / 32)1int53 % 32

至于Flip功能...

好吧,你已经有了Query(), Set(), Unset()

简单的

Flip(i) {
 Query(i) ? Unset(i) : Set(i)
} 

会做的工作。

于 2012-07-11T23:57:03.757 回答