C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

ビットからバイトを簡単に得る方法 /ブラック (19/11/30(Sat) 17:29) #93255
Re[1]: ビットからバイトを簡単に得る方法 /魔界の仮面弁士 (19/11/30(Sat) 19:23) #93257
Re[1]: ビットからバイトを簡単に得る方法 /キングダム (19/11/30(Sat) 18:59) #93256
  └ Re[2]: ビットからバイトを簡単に得る方法 /ブラック (19/11/30(Sat) 21:46) #93259 解決済み
    └ Re[3]: ビットからバイトを簡単に得る方法 /ブラック (19/11/30(Sat) 21:49) #93260
      ├ Re[4]: ビットからバイトを簡単に得る方法 /KOZ (19/11/30(Sat) 22:06) #93261
      └ Re[4]: ビットからバイトを簡単に得る方法 /キングダム (19/11/30(Sat) 22:20) #93263
        └ Re[5]: ビットからバイトを簡単に得る方法 /ブラック (19/12/01(Sun) 14:08) #93266 解決済み


親記事 / ▼[ 93257 ] ▼[ 93256 ]
■93255 / 親階層)  ビットからバイトを簡単に得る方法
□投稿者/ ブラック (1回)-(2019/11/30(Sat) 17:29:24)

分類:[.NET 全般] 

あるバイト変数があり、
それのnビット目が立っているかどうかを調べたいのですが、
普通に書くと以下のようになると思います。


        Dim bbb As Byte = 0

        Dim n As Integer = 4

        If bbb = (bbb Or CByte(2 ^ (n - 1))) Then

        End If

もっとエレガントに、00010000のような数列から
ビット演算をすることはできないでしょうか?

あるいは
以下のページに書かれてあるように
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1472855599
Enumで宣言しておくのが通常なのでしょうか?


[ □ Tree ] 返信 編集キー/

▲[ 93255 ] / 返信無し
■93257 / 1階層)  Re[1]: ビットからバイトを簡単に得る方法
□投稿者/ 魔界の仮面弁士 (2500回)-(2019/11/30(Sat) 19:23:46)
No93255 (ブラック さん) に返信
> あるバイト変数があり、
> それのnビット目が立っているかどうかを調べたいのですが、
> 普通に書くと以下のようになると思います。
> If bbb = (bbb Or CByte(2 ^ (n - 1))) Then

Visual Basic のバージョンは何でしょうか?

2003 以降ならビットシフト演算子を使えるので、n が 1〜8 の範囲であるのなら、
「CByte(2 ^ (n - 1))」よりも「CByte(1) << (n - 1)」の方が良いと思います。

^ 演算子って、結局のところ Math.Pow メソッドの呼び出しに過ぎないので、
前者だと、CByte 前に Double 型で処理されてしまうのが無駄に思えます。


> もっとエレガントに、00010000のような数列から
> ビット演算をすることはできないでしょうか?

2017 以降なら、2 進数リテラル表現を使って数値を表現できます。
Dim bin As Byte = &B1100_1001
[ 親 93255 / □ Tree ] 返信 編集キー/

▲[ 93255 ] / ▼[ 93259 ]
■93256 / 1階層)  Re[1]: ビットからバイトを簡単に得る方法
□投稿者/ キングダム (48回)-(2019/11/30(Sat) 18:59:02)
No93255 (ブラック さん) に返信

標準ライブラリにはないっぽいです
フラグに名前があるならEnumを定義するとわかりやすいですけど
ちょっと計算したいだけなんだってときはこんな関数こしらえます私なら

If IsFlag(bbb, 1 << 4) Then

End If

Function IsFlag(ByVal num As Byte, ByVal flag As Byte) As Boolean
Return (num And flag) = flag
End Function

[ 親 93255 / □ Tree ] 返信 編集キー/

▲[ 93256 ] / ▼[ 93260 ]
■93259 / 2階層)  Re[2]: ビットからバイトを簡単に得る方法
□投稿者/ ブラック (2回)-(2019/11/30(Sat) 21:46:02)
納得しました
どうもありがとうございます。
解決済み
[ 親 93255 / □ Tree ] 返信 編集キー/

▲[ 93259 ] / ▼[ 93261 ] ▼[ 93263 ]
■93260 / 3階層)  Re[3]: ビットからバイトを簡単に得る方法
□投稿者/ ブラック (3回)-(2019/11/30(Sat) 21:49:11)
すいません、
一つお聞きするのを忘れていました。
調べていて、
https://riptutorial.com/ja/vb-net/example/5910/flags%E5%B1%9E%E6%80%A7

<Flags>属性というものがあることを知りました
検索すると情報ページはたくさん見つかるのですが、
一体、これがどういう役目をしているのか分かりません。
通常のEnumと何が違うのでしょうか?

上のページでは
複数の値をenum変数に割り当てることができます。
と書かれていますが、
<Flags>属性を付けなくとも
複数の値を付けられると思います

何が違うのでしょうか?

[ 親 93255 / □ Tree ] 返信 編集キー/

▲[ 93260 ] / 返信無し
■93261 / 4階層)  Re[4]: ビットからバイトを簡単に得る方法
□投稿者/ KOZ (58回)-(2019/11/30(Sat) 22:06:03)
No93260 (ブラック さん) に返信
> <Flags>属性を付けなくとも
> 複数の値を付けられると思います
> 何が違うのでしょうか?

ToString() すると違いが分かります。

<Flags>
Enum TestEnum
    A = 1
    B = 2
End Enum

Dim t As TestEnum = TestEnum.A Or TestEnum.B
Debug.Print(t.ToString())

<Flags> をつけないと 3、つけると"A, B" になります。


[ 親 93255 / □ Tree ] 返信 編集キー/

▲[ 93260 ] / ▼[ 93266 ]
■93263 / 4階層)  Re[4]: ビットからバイトを簡単に得る方法
□投稿者/ キングダム (49回)-(2019/11/30(Sat) 22:20:08)
No93260 (ブラック さん) に返信

Flagsは他の開発者やプログラムに対してこのEnumはフラグとして使用できるよ
ビット演算が可能だよってことを示すためのもののようです

Flagsがある⇒ビット演算はできる
Flagsがない⇒ビット演算はできるかもしれないし、できないかもしれない

って感じなのでEnumをフラグとして使用するならFlags使った方が良さげです

[ 親 93255 / □ Tree ] 返信 編集キー/

▲[ 93263 ] / 返信無し
■93266 / 5階層)  Re[5]: ビットからバイトを簡単に得る方法
□投稿者/ ブラック (4回)-(2019/12/01(Sun) 14:08:33)
皆様、どうもありがとうございました。
解決済み
[ 親 93255 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -