質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

5回答

19941閲覧

16ビット整数の特定のビットを立てたり落としたりしたい。

Battiruno

総合スコア13

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2016/04/14 04:30

編集2016/04/14 04:47

###前提・実現したいこと
VB.netである16ビット整数の特定のビットを操作したいです。

例:取得値「8」の10ビット目を立てたい。

取得型:integer
取得値:8 ビットで表すと「0000 0000 0000 1000」
操作後:1032 ビットで表すと「0000 0100 0000 1000」

値は取得できています。
あとはビットを操作するだけなのですが・・・

追記:
どのビットを操作するかは変動します。
何ビット目かは値として取得しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

ビット演算子を使うと良いです。

Integer 変数aのnビット目を立てるプログラムは、次のようになります。

x = 1; // xは、1ビット目だけが1で、他のビットは0の値になります。 x << (n - 1); // x を n-1 ビットだけ左にシフトします。 // そうすると、nビット目だけが1で、他のビットは0の値になります。 a = a Or x; // OR演算子を使って、aのnビット目だけを立てます。

また、nビット目だけを下ろす(0にする)には、Not演算子を使ってnビット目だけが0の値を作り、AND演算子でnビット目だけを下ろします。

x = 1; // xは、1ビット目だけが1で、他のビットは0の値になります。 x << (n - 1); // nビット目だけが1で、他のビットは0の値になります。(ここまでは上のプログラムと同じ) x = Not x; // Not演算子で各ビットが反転しますから、nビット目だけが0で、他のビットは1の値になります。 a = a And x; // And演算子を使って、aのnビット目だけをおろします。

投稿2016/04/14 05:20

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Battiruno

2016/04/14 05:30

回答ありがとうございました。 シフトさせて立てるビットを作成してビット演算で実際にビットを立てればいいんですね。 助かりました。ありがとうございます。
guest

0

何ビット目を立てたり落としたりするにはどうすればいいのかが
思いつきません。

Integer ですと、プラスマイナスになるので
可能であれば、ULong:64ビット、UInteger:32ビット
の使用を検討してください。
'
ヒント:
10進数表記:1,2,4,8,16,32,64,128 ...
16進数表記: はどうなるでしょう
2進数表記: はどうなるでしょう
数値に対して、AND/ORをするとは、どう云う事を行っているのでしょうか?
⇒基礎なので、丁寧に検索すれば、探せます。
PLCをやっている方であれば、理屈は解っているはずです。

投稿2016/04/14 05:08

daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ビットをOFFにしたいならNotでビット反転させた物とAndで論理積を求め
ビットをONにしたいならOrで論理和を求めれば望む結果が得られませんか?

投稿2016/04/14 04:40

HiroshiWatanabe

総合スコア2160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Battiruno

2016/04/14 04:49

回答ありがとうございます。 ビット演算に関しては理解できているのですが、 何ビット目を立てたり落としたりするにはどうすればいいのかが 思いつきません。
HiroshiWatanabe

2016/04/14 05:18

bit0 は 2^0 bit1 は 2^1 bit2 は 2^2 bit3 は 2^3 なので n 番目のビットだけがONになっている数値は 2^n で求められます。 この n 番目のビットだけがONになっている数値と Or すれば目的のビットがONになります。
Battiruno

2016/04/14 05:21

ありがとうございます。 おかげで光が見えてきました。
guest

0

x = x Or &H0400

投稿2016/04/14 04:36

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Battiruno

2016/04/14 04:45

回答ありがとうございます。 質問に追記させていただきますが、 &H0400ですが、10ビット目と限らず5や7ビット目を表す場合は どのように計算すれば出ますでしょうか? 値として何ビット目かは取得できています。 あと、特定ビットを落とす場合はどのようにすればいいでしょうか?
guest

0

ビット演算を行いたいとの事でしょうか。

a = 0000 0000 0000 1000
b = 0000 0100 0000 0000
c = a Or b

これで、c = 0000 0100 0000 1000
です。

「VB.net ビット演算」で検索すると、いろいろ出てきます。

公式ドキュメントは、
VB .NET プログラミングリファレンス - 3-4 演算子
こちらです。

PLCとの値のやりとりは、よくわかりません、、、すいません。

投稿2016/04/14 04:35

ItoTomonori

総合スコア1283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Battiruno

2016/04/14 04:39

回答ありがとうございます。 ビット演算は理解できているのですが、 そこまでのプロセスがわからずに質問させていただきました。 取得してきた値を16ビット整数に変換してビット演算・・・という感じなのでしょうか? わかりづらい質問で申し訳ありませんでした・・・
ItoTomonori

2016/04/14 04:44

取得してきた値は、integerなのでしょうか?仮にその値が、 Dim srcVal as integer とするならば、 Dim dstVal as integer dstVar = srcVar Or 0x0400 でよさそうですが???
ItoTomonori

2016/04/14 05:23 編集

もしかしてですが、 nビット目という所でつまずかれている??? nビット目が 1 の値は、0000 0000 0000 0001 を左に10回シフトした値ですので、 Dim bitSeed As Integer bitSeed = 0x0001 Dim n As Integer n = 10 '10ビット目 Dim result as Integer result = bitSeed << (n-1) これで、 result = &H0400 '(2進表記です)0000 0100 000 0000 が取得できます。
Battiruno

2016/04/14 05:32

回答ありがとうございます。 実際その部分でつまづいていました・・・ わかりやすく解説していただきありがとうございました。 また何かあればよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問