-1

こんにちは、私は Visual Basic の初心者です。値の個々のビットを操作できるようにする必要があるプロジェクトがあります。

これらのビットを 1 と 0 の間で切り替え、複数のビットをコード内の 1 つの変数に結合できるようにする必要があります。

各ビットは単一の TRUE / FALSE 値を表すため、1 つの変数で単一の TRUE / FALSE 値を実行する方法を探しているのではなく、1 つの変数で複数の TRUE / FALSE 値を実行する方法を探しています。

どうすればこれを達成できるか教えてください。

よろしくお願いします。

4

3 に答える 3

3

正確に1ビットである必要がありますか?

これには、実際に組み込まれている VB データ型の Boolean を使用してみませんか。

http://msdn.microsoft.com/en-us/library/wts33hb3(v=vs.80).aspx

存在する唯一の理由は、true または false の 2 つの状態を持つ変数を定義できるようにするためです。

Dim myVar As Boolean
myVar = True
myVar = Flase
if myVar = False Then
  myVar = True
End If

更新 (1)

OPからのさまざまな回答とコメントを読んだ後、OPが達成しようとしていることを理解しました。

他の人が言ったように、これらの言語のいずれかで使用できる最小単位は 8 ビットバイトです。これよりもビットサイズが小さいデータ型の順序はありません。

ただし、ちょっとした工夫と二項演算のちょっとした工夫で、そのバイトの内容を個々のビットとして参照することができます。

ただし、最初に 2 進数システムを理解する必要があります。

2 進数のすべての数値は、右から左に 2 の累乗です。

各列は前の列の 2 倍なので、次のようになります。

1 は 2 になり、2 は 4 になり、4 は 8 になります。

これを純粋に2進数で見ると、列には次のようにラベルが付けられます。

128 64 32 16 8 4 2 1 (右から左です)

これにより、次のことがわかります。

The bit at position 1 = 1;
The bit at position 2 = 2;
The bit at position 3 = 4;
The bit at position 4 = 8;

等々。

あなたが持っている最小のデータ型(バイト)でこのメソッドを使用すると、8ビットを1つの値にパックできます。つまり、1 つの変数を使用して、1 または 0 の 8 つの個別の値を保持できます。

したがって、1 バイトよりも小さくすることはできませんが、8 つの値を 1 つの変数にパックすることでメモリ消費を削減できます。

値をどのように読み書きしますか?

列の位置を覚えていますか? ビットシフトとビットマスクと呼ばれるものを使用できます。

ビットシフトは、

<<

>>

オペレーター

シフト操作は、シフトする列の数をパラメーターとして受け取ります。

例えば:

Dim byte myByte
myByte = 1 << 4

この場合、変数 'myByte' は 16 に等しくなりますが、実際にはビット位置 5 を 1 に設定したことになります。

mybyte = 0  = 00000000 = 0
mybyte = 1  = 00000001 = 1
mybyte = 2  = 00000010 = (1 << 1)
mybyte = 4  = 00000100 = (1 << 2)
mybyte = 8  = 00001000 = (1 << 3)
mybyte = 16 = 00010000 = (1 << 4)

0 から 16 までは、上記の右から左の列の値と等しいことに注意してください。

今説明したことを考えると、ビット 5、4、1 を 1 に設定し、残りを 0 に設定したい場合は、次のように簡単に使用できます。

mybyte = 25(16 + 8 + 1) = 00011001 = (1 << 4) + (1 << 3) + 1

あなたのビットをシングルトンに戻すには、逆にビットシフトするだけです

retrieved bit = mybyte >> 4 = 00000001

残念ながら、ビットシフト方式には小さな欠陥が 1 つあります。

前後にシフトすることで、設定済みのビットから情報を失う可能性が非常に高くなります。これを防ぐには、ビット シフト操作をビット マスクや「AND」&「」などのブール演算と組み合わせる方がよいでしょう。また'

これらが何であるかを理解するには、まず次のような単純な論理原則を理解する必要があります。

A と B の両方の入力が 1 の場合、出力は 1 です

これを図で説明すると

A  B | Output
-------------
0  0 | 0
0  1 | 0
1  0 | 0
1  1 | 1

入力数値のビット位置が 1 で、入力数値 B の同じ位置が 1 である場合にわかるように、出力数値でその位置を保持します。それ以外の場合、ビットを破棄して 0 に設定します。 、次の例を見てください。

00011001 = Bits 5,4 and 1 are set
00010000 = Our mask ONLY has bit 5 set

私たちが実行する場合

00011001 AND 0010000

の結果が得られます

00010000

これを 5 だけシフトダウンできます

00010000 >> 5 = 00000001 = 1

したがって、AND を使用することで、バイト内の個々のビットの値が 1 かどうかをチェックする方法が得られます。

if ((mybyte AND 16) >> 1) = 1 then
  'Bit one is set
else
  'Bit one is NOT set
end if

前に示したように、右から左の列に 2 の異なる値を持つさまざまなマスクを使用することで、バイトからさまざまな特異値を簡単に抽出し、それらを単純なビット値として扱うことができます。

「OR」を使用して反対の方法で操作を実行することを除いて、バイトの設定は同じくらい簡単です

また

A または B 入力のいずれかが 1 の場合、出力は 1 です

これを図で説明すると

A  B | Output
-------------
0  0 | 0
0  1 | 1
1  0 | 1
1  1 | 1

例えば:

00011001 OR 00000100 = 00011101

ご覧のとおり、位置 4 のビットが設定されています。

ただし、これをすべて開始した基本的な質問に答えるには、VB で 1 バイト未満の解像度を持つデータ型を使用することはできません。絶対的なビット単位の精度が必要な場合は、圧縮アルゴリズムのいずれかを作成する必要があると思います。またはある種の暗号化システム。:-)

于 2013-01-18T14:52:07.413 に答える
0

01010100 01110010 01110101 01100101 は、単語「TRUE」の文字列値です。

あなたが望むのは、情報をブール値で保存することです

Dim v As Boolean

v = True
v = False

また

If number = 84 Then ' 84 = 01010100 = T
    v = True
End If

他の情報

技術的には、ビットに何も保存できません。最小値は 8 ビットの char です。ビット演算の方法を学ぶ必要があります。またはBitArrayクラスを使用します。

于 2013-01-18T15:35:42.167 に答える
0

VB.NET (および私が知っている他の .NET 言語) には、「ビット」データ型があります。使用できる最小のものはByte. ( ではありませんChar。サイズは 2 バイトです)。そのため、値 84 のバイトを読み取って true の値 1 を持つバイトに変換し、値 101 のバイトを false の値 0 のバイトに変換することはできますが、メモリを節約することにはなりません。

現在、これらのフラグの数が少なく固定されている場合は、そのうちのいくつかを整数データ型の 1 つに格納できます (.NET では、最大の整数データ型は 64 ビットです)。または、これらのフラグが多数ある場合は、BitArrayクラスを使用できます (同じ手法を使用しますが、配列でバックアップするため、ストレージ容量が大きくなります)。

于 2013-01-18T16:08:03.543 に答える