1. 程式人生 > >C#BitVector32結構操作說明

C#BitVector32結構操作說明

BitVector32結構體位於System.Collections.Specialized名稱空間內,相對.NET中另外一個位容器BitArray,他的優點是速度快,佔用空間小,並可以儲存小數字。他內部用一個32位的整數來儲存資料,因此只能儲存32位的位元資料。

首先BitVector32本質上用一個32位的數來表示資料,那麼初始化BitVector32結構時必須制定一個最初值,使用者可以傳入一個int或者另一個已經存在的BitVector32來構造一個新的BitVector32.

BitVector32的Data屬性返回一個int用來表示內部資料,如果用來顯示BitVector32的內容,這個Data是沒有意義的,因為他是十進位制化的結果,這時候用BitVector32的ToString方法就可以返回有用的文字說明。

BitVector32 bits =newBitVector32(0xF);
//初始化BitVector32:設定低4位為1  0x 00 00 00 00 00 00 00 0F
Console.WriteLine(bits.Data);
//(十六進位制)0xF 等於 (二進位制)1111 等於 (十進位制)15 所以輸出15
Console.WriteLine(bits.ToString());
//輸出:BitVector32{00000000000000000000000000001111} (看得出來:後四位是1)

接下來就是最重要的位操作了。

BitVector32結構體提供索引器(Indexer)可以直接通過bool物件操作BitVector32結構,索引器引數是int,這個int可不是指第幾位的意思(BitArray中的索引器是第幾位),而是需要一個位掩碼(位遮蔽),通過這個BitVector32通過這個位掩碼來操作內部位元位,來看看Reflector下BitVector32索引器的原始碼

structBitVector32
{
//data 就是 BitVector32的Data屬性的對應欄位
publicboolthis[int bit]
    {
get
        {
return ((this.data & bit) == ((ulong)bit));
//通過資料和掩碼的與操作,來將其他位清0,保留掩碼的設定位
//如果操作後的結果等於掩碼,很顯然這是操作位就是1,返回true
//否則的話,返回false
        }
set
        {
if (value)
            {
this.data |= (uint)bit;
//資料 = 資料 OR 掩碼,將指定位設定成1
} else { this.data &= (uint)~bit; //資料 = 資料 AND 掩碼取反,將指定位設定成0 //C# 取反位操作運算子:~ } } } }

上面程式碼我加了註釋,可以看到,BitVector32的位操作就是利用普通位掩碼的操作。

好了那麼用BitVector32索引器操作其實就是定義好位掩碼,接著取回資訊或者賦值就可以了。

//注意using System.Collections.Specialized;

int mask1 =1;
//掩碼代表最後一位:二進位制表示:0...0001
int mask2 =4;
//掩碼代表倒數第三位:二進位制表示:0...0000100

BitVector32 bits =newBitVector32(-1);
//-1補碼:1...1111 
//設定BitVector32全部為1
Console.WriteLine(bits);

Console.WriteLine("設定最後一位和倒數第三位位0");
bits[mask1] = bits[mask2] =false;
Console.WriteLine(bits);

Console.WriteLine("設定倒數第三位為1");
bits[mask2] =true;
Console.WriteLine(bits);

輸出:

BitVector32{11111111111111111111111111111111}
設定最後一位和倒數第三位位0
BitVector32{11111111111111111111111111111010}
設定倒數第三位為1
BitVector32{11111111111111111111111111111110}

相關推薦

C#BitVector32結構操作說明

BitVector32結構體位於System.Collections.Specialized名稱空間內,相對.NET中另外一個位容器BitArray,他的優點是速度快,佔用空間小,並可以儲存小數字。他內部用一個32位的整數來儲存資料,因此只能儲存32位的位元資料。 首

C 資料結構中單鏈表基本操作

C中的typedef C中的typedef關鍵字作用是為一種資料型別定義一個新名字,這樣做的目的有兩個,一是給變數定義一個易記且意義明確的新名字,如: typedef unsigned char BYTE; 把unsigned char型別自命名為BYTE。另一個目的是

C#操作華澳漢讀寫器讀寫M1卡往扇區塊寫入讀取值小結

    近期因為專案中需要用到往IC卡的扇區塊中寫入值 並讀取值,並且是漢字。官方給的demo示例不是很規範,過程也有很多坑。先總結如下: 1、調整mifareone類中寫入的函式引用 最後一個寫入的文字引數由原 改為:    因為根據幫助文件,寫

C 資料結構佇列和棧基本操作

佇列 佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。佇列是一種操作受限制的線性表。 與現實中的排隊類似,進行插入操作只能在隊尾,進行刪除操作只能在隊頭。佇列是一種先進先出的線性表。 C實現佇列,需要定義一個結

C 資料結構迴圈連結串列(帶環連結串列)基本操作

經典迴圈連結串列之約瑟夫問題:標號從1到n的n個人圍成一個圈,從1開始計數到m的人退出圈子,然後從退出的下一個人開始接著從1計數,數到m的人後繼續退出,最後只剩下一個人,求剩下人的編號。這便是約瑟夫問題的模型。 經典迴圈連結串列之魔術師發牌問題:魔術師手中有A、2、3……J

c++ 資料結構 稀疏矩陣類的定義及其各種操作的實現

稀疏矩陣類:      該型別的矩陣中0元素佔多半,我們平常儲存一般矩陣一般用二維陣列,但是該矩陣的0元素既佔用儲存空間,而且在運算中會花費大量時間來進行0元素的無效運算。 因此我們利用三元陣列(注意不是三維陣列)儲存非零元素的座標和值。 以下是稀疏矩陣的類定義和各種操作的

c資料結構線性表之單鏈表(帶頭結點)基本操作

#include<stdio.h> #include<malloc.h> #define MAXSIZE 10 #define ElemType char #define OK 1 #define ERROR 0 typedef struct Nod

C++資料結構】模版類實現雙迴圈連結串列的基本操作

單鏈表結構為我們提供方便分資料插入和刪除工作,美中不足的是查詢資料不方便,對於單鏈表查詢資料至少要遍歷一邊.  為此我們提出雙鏈表結構,從而方便的查詢資料. 給出雙鏈表的一般結構: 一種是帶頭結點(哨兵位)的管理方式,另一種是帶管理節點管理方式。 但是我們不建議採用

C++ 資料結構的單鏈表的建立,插入,刪除操作

動態記憶體分配應用舉例(連結串列)  我們知道,陣列式計算機根據事先定義好的陣列型別與長度自動為其分配一連續的儲存單元,相同陣列的位置和距離都是固定的,也就是說,任何一個數組元素的地址都可一個簡單的公式計算出來,因此這種結構可以有效的對陣列元素進行隨機訪問。但若對陣列元素進行插入和刪除操作,則會引起大量

C語言結構體中添加成員函數

我們 pau 打印 log print class 控制 stdio.h 語言   我們在使用C語言的結構體時,經常都是只定義幾個成員變量,而學過面向對象的人應該知道,我們定義類時,不只是定義了成員變量,還定義了成員方法,而類的結構和結構體非常的相似,所以,為什麽不想想如何

JavaScript與C#的互操作示例

html 一個 互操作 第一次 demo dem 寫博客 第三方類 第三方 近期,因為項目需要開發PC版本,所以涉及到PC版本開發技術選型的問題。 采用winForm:界面設計太難看了 采用wpf:界面好看,但是內存占用太大了。而且公司WPF技術實力不強 最後,決定采用前端

c語言結構體大小 sizeof(struct A)

成員 print ble ret 意義 cnblogs () pan color 1,數據類型自身對齊 數據類型的起始地址為其大小的整數倍 2,結構體的自身對齊 結構體的自身對齊值為其中最大的成員大小 3,指定對齊 可以使用關鍵詞#pragma pack(1) 來指定結構體

Hive 表結構操作

comment 修改字段 color alt 名稱 user str exists change 添加列 add columns     alter table table_name add columns (id int comment ‘主鍵ID‘ ) ;    

【整理】C#文件操作大全(SamWang)

cto read image creating ram exceptio file類 詳細 ima 文件與文件夾操作主要用到以下幾個類:   1.File類:   提供用於創建、復制、刪除、移動和打開文件的靜態方法,並協助創建 FileStre

C#的access操作工具類

C# access 操作工具類 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.OleDb; using System.Data

C/C++ 文件操作之CreateFile、ReadFile和WriteFile

amp 列表 invalid bsp 功能 空間 out 系統 file 通常使用下列函數來通過Win系統來對外圍設備進行通信處理: ------------------------------- 1. CreateFile   這個函數的功能是創建或者打開一個文件或者I/

C#註冊表操作匯總

最重要的 含義 設置 數據 表示 找到 win har avi 一、註冊表基本知識 1) 結構 鍵->項->子項->值項(名稱、類型、數據) REG_SZ 字符串 REG

c# 連接操作linux

加ss 背景 readline isp connect 一個 load username chang 0.背景 現在linux重要性是顯然易見的,學習linux是必須,通過程序來來控制linux 也能發揮很大的作用。比如我們可以做一個自動化部署的程序,來發布程序到linu

C/C++文件操作

++ dir gin 自動刪除 lac 關閉 讀文件 文本 可選 1 基於C的文件操作 在ANSI C中,對文件的操作分為兩種方式,即流式文件操作和I/O文件操作 2 一、流式文件操作 3 4 1.fopen() 5 FILE *fopen(

C# 文件操作方法

files 方法 .get cnblogs 操作 length close enc clas 方法一: FileStream textFile = File.Open(@"F:\程序\新手測試\linqApplication1\linqAp