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

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

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

ビットからバイトを簡単に得る方法

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■93255 / inTopicNo.1)  ビットからバイトを簡単に得る方法
  
□投稿者/ ブラック (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で宣言しておくのが通常なのでしょうか?


引用返信 編集キー/
■93256 / inTopicNo.2)  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

引用返信 編集キー/
■93257 / inTopicNo.3)  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
引用返信 編集キー/
■93259 / inTopicNo.4)  Re[2]: ビットからバイトを簡単に得る方法
□投稿者/ ブラック (2回)-(2019/11/30(Sat) 21:46:02)
納得しました
どうもありがとうございます。
解決済み
引用返信 編集キー/
■93260 / inTopicNo.5)  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>属性を付けなくとも
複数の値を付けられると思います

何が違うのでしょうか?

引用返信 編集キー/
■93261 / inTopicNo.6)  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" になります。


引用返信 編集キー/
■93263 / inTopicNo.7)  Re[4]: ビットからバイトを簡単に得る方法
□投稿者/ キングダム (49回)-(2019/11/30(Sat) 22:20:08)
No93260 (ブラック さん) に返信

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

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

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

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

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ