画像ファイル
画像ファイル インデクサでBit操作(C#、VB.NET)
C# コード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace indexerc3
{
public partial class Form1 : Form
{
//インデクサを持つクラス
public indexbit Bit = new indexbit();

//ビットの表示用のピクチャーボックスを作成
PictureBox[] pb = new PictureBox[16];
public Form1()
{
InitializeComponent();
textBoxBit.Text = "0";
Bit.value = 0;

//ピクチャーボックスの番号から配列番号を取得し
//そのピクチャーボックスをピクチャーボックスの
//配列に入れている
foreach (Control cl in groupBox1.Controls )
{
//コントロールの名前にpictureBoxが付いていたら
if (cl.Name.StartsWith("pictureBox"))
{
//プログラムを読みやすくするだけ pictureBoxの長さ
int subLength = "pictureBox".Length;

//名前から番号を取得
int no = int.Parse(cl.Name.Substring(subLength, cl.Name.Length
- subLength)) - 1;

//ピクチャーボックスを配列に入れる
if(no<17)
pb[no] = (PictureBox)cl;
}
}
}


//ビット反転ボタン押下
private void butSet_Click(object sender, EventArgs e)
{
try
{
//ビット番号を取得
int index = int.Parse(textBoxBit.Text);

//ビットの状態を反転させる
Bit[index] = !Bit[index];

//反転結果を数値にして表示
textBoxInt.Text = Bit.value.ToString();
//ピクチャーボックスにビットを表示
setPicBoxColor();

}
catch
{
MessageBox.Show("数値が設定されていません。");
}
}

//ピクチャーボックスの表示を変える
private void setPicBoxColor()
{
for (int i = 0; i < 16; i++)
//インデクサが使用されている
if (Bit[i])
pb[i].BackColor = Color.LightGreen;
else
pb[i].BackColor = Color.DarkGreen;
}

//数値をセットする
private void butintSet_Click(object sender, EventArgs e)
{
//通常のプロパティにアクセス
Bit.value = UInt16.Parse(textBoxInt.Text);
//ピクチャーボックスの表示を変える
setPicBoxColor();
}

}

//インデクサを持つクラス
public class indexbit
{
//フィールドで16ビットの値を保持
private UInt16 ibit ;

//valueプロパティで数値の設定取得が出来る
public UInt16 value
{
get
{
return ibit;
}
set
{
ibit = value;
}
}

//インデクサの記述
public bool this[int index]
{
//bitの取得
get
{
//例外も投げることが出来る
//16ビット以上は例外を投げる
if (index > 15)
throw new System.Exception();

//検査するビットの計算
UInt16 i = (UInt16)Math.Pow(2, index);

//検査ビットが立っていたらtrueを返す
if ((ibit & i) > 0)
return true;
else
return false;
}

//bitの設定
set
{
if (index > 15)
throw new System.Exception();

//設定するビットの計算
UInt16 i = (UInt16)Math.Pow(2, index);

//セットならビットのorを
if (value == true)
ibit |= i;
//リセットはビットを反転させてandを取る
else
ibit &= (UInt16)(~i);
}
}
}
}
画像 上記C#コードのダウンロード
画像 上記VB2005のコードのダウンロード

画像ファイル