⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitmap.cc

📁 Nachos是个教学用的小型操作系统
💻 CC
字号:
// bitmap.cc//	Routines to manage a bitmap -- an array of bits each of which//	can be either on or off.  Represented as an array of integers.//// Copyright (c) 1992-1996 The Regents of the University of California.// All rights reserved.  See copyright.h for copyright notice and limitation // of liability and disclaimer of warranty provisions.#include "copyright.h"#include "debug.h"#include "bitmap.h"//----------------------------------------------------------------------// BitMap::BitMap// 	Initialize a bitmap with "numItems" bits, so that every bit is clear.//	it can be added somewhere on a list.////	"numItems" is the number of bits in the bitmap.//----------------------------------------------------------------------Bitmap::Bitmap(int numItems) {     int i;    ASSERT(numItems > 0);    numBits = numItems;    numWords = divRoundUp(numBits, BitsInWord);    map = new unsigned int[numWords];    for (i = 0; i < numWords; i++) {	map[i] = 0;		// initialize map to keep Purify happy    }    for (i = 0; i < numBits; i++) {        Clear(i);    }}//----------------------------------------------------------------------// Bitmap::~Bitmap// 	De-allocate a bitmap.//----------------------------------------------------------------------Bitmap::~Bitmap(){     delete map;}//----------------------------------------------------------------------// Bitmap::Set// 	Set the "nth" bit in a bitmap.////	"which" is the number of the bit to be set.//----------------------------------------------------------------------voidBitmap::Mark(int which) {     ASSERT(which >= 0 && which < numBits);    map[which / BitsInWord] |= 1 << (which % BitsInWord);    ASSERT(Test(which));}    //----------------------------------------------------------------------// Bitmap::Clear// 	Clear the "nth" bit in a bitmap.////	"which" is the number of the bit to be cleared.//----------------------------------------------------------------------void Bitmap::Clear(int which) {    ASSERT(which >= 0 && which < numBits);    map[which / BitsInWord] &= ~(1 << (which % BitsInWord));    ASSERT(!Test(which));}//----------------------------------------------------------------------// Bitmap::Test// 	Return TRUE if the "nth" bit is set.////	"which" is the number of the bit to be tested.//----------------------------------------------------------------------bool Bitmap::Test(int which) const{    ASSERT(which >= 0 && which < numBits);        if (map[which / BitsInWord] & (1 << (which % BitsInWord))) {	return TRUE;    } else {	return FALSE;    }}//----------------------------------------------------------------------// Bitmap::FindAndSet// 	Return the number of the first bit which is clear.//	As a side effect, set the bit (mark it as in use).//	(In other words, find and allocate a bit.)////	If no bits are clear, return -1.//----------------------------------------------------------------------int Bitmap::FindAndSet() {    for (int i = 0; i < numBits; i++) {	if (!Test(i)) {	    Mark(i);	    return i;	}    }    return -1;}//----------------------------------------------------------------------// Bitmap::NumClear// 	Return the number of clear bits in the bitmap.//	(In other words, how many bits are unallocated?)//----------------------------------------------------------------------int Bitmap::NumClear() const{    int count = 0;    for (int i = 0; i < numBits; i++) {	if (!Test(i)) {	    count++;	}    }    return count;}//----------------------------------------------------------------------// Bitmap::Print// 	Print the contents of the bitmap, for debugging.////	Could be done in a number of ways, but we just print the #'s of//	all the bits that are set in the bitmap.//----------------------------------------------------------------------voidBitmap::Print() const{    cout << "Bitmap set:\n";     for (int i = 0; i < numBits; i++) {	if (Test(i)) {	    cout << i << ", ";	}    }    cout << "\n"; }//----------------------------------------------------------------------// Bitmap::SelfTest// 	Test whether this module is working.//----------------------------------------------------------------------voidBitmap::SelfTest() {    int i;        ASSERT(numBits >= BitsInWord);	// bitmap must be big enough    ASSERT(NumClear() == numBits);	// bitmap must be empty    ASSERT(FindAndSet() == 0);    Mark(31);    ASSERT(Test(0) && Test(31));    ASSERT(FindAndSet() == 1);    Clear(0);    Clear(1);    Clear(31);    for (i = 0; i < numBits; i++) {        Mark(i);    }    ASSERT(FindAndSet() == -1);		// bitmap should be full!    for (i = 0; i < numBits; i++) {        Clear(i);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -