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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

1793閲覧

チェックボックスの値を再現したい(2のべき乗を利用したパータン)

lleldigm

総合スコア59

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/05/29 14:20

編集2020/05/29 14:21

いつもお世話になっております。他者が書いたC#でのコードを触っているのですが、以下の点で詰まっているので
コードの教授お願いします。


下記のようなフォームにチェックボックスがあったとします。
フォーム[デザイン]-----------
チェックボックス(複数選択可)
□1時 □2時 □3時
□4時 □5時 □6時
□7時 □8時 □9時
□10時 □11時 □12時
o-----------------------------

これらのチェックボックスで選択された時間を下記の数値で加算していき、1つintに保存しています。

C#

1//1時:1、2時:2、3時:4、4時:8、5時:16、6時:32 2//7時:64、8時:128、9時:256、10時:512、11時:1024、12時:2048 3int check_result;

※未選択の場合「0」
「1時」のみ選択「1」
「1時」と「2時」が選択された場合は「3」
「1時」と「2時」と「10」が選択された場合は「515」
全選択の場合「4095」

このcheck_resultの値からチェックボックスを再度再現するにはどのような処理(コード)を書けばよいか教えて頂きたいです
宜しくお願いします。

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

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

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

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

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

guest

回答3

0

  • check_resultを2で割った余りを取得する(1ならチェックボックスon、0だったらoff)
  • check_resultを2で割った商を新しいcheck_resultに代入

を繰り返すことで先頭から順番にチェックボックスの状態を取得できます。

投稿2020/05/29 14:32

編集2020/05/29 16:01
hope_mucci

総合スコア4447

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

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

lleldigm

2020/05/29 15:43 編集

int result = result = check_result % 2; if(result == 1) checkbox1.checked = true; result = check_result % 4; if(result == 1) checkbox2.checked = true; result = check_result % 8; if(result == 1) checkbox3.checked = true; ..... ということですか・・?
hope_mucci

2020/05/29 16:04

間違っています。回答の内容をそのままコードにするだけ。4とか8とか不要。
lleldigm

2020/05/29 16:25 編集

if((check_result % 2) == 1) { checkbox1.checkbox1.checked = true; } check_result /= 2; if((check_result % 2) == 1) { checkbox1.checkbox2.checked = true; } check_result /= 2; ......
hope_mucci

2020/05/30 06:21

そうそう、その通りです。チェックボックスを配列にしておけばfor文で回せます。
lleldigm

2020/05/30 15:42

なるほどー!思いつきませんでした。ありがとうございます!
guest

0

ビット演算について調べてみてください。

投稿2020/05/29 14:31

YAmaGNZ

総合スコア10489

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

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

lleldigm

2020/05/29 15:26

回答ありがとうございます。調べてみます。
guest

0

ベストアンサー

check_resultを対応するチェックボックスの数値とAND演算して、0じゃなかったらチェックを付ければいいんじゃないでしょうか。

2のべき乗ということは、それぞれが2進数の1桁に当てはまります。
例に上がってる515を2進数にすると、
‭‭001000000011‬
となります。1になってる桁が、チェックの入ってるチェックボックスということになります。
2桁目(2時)を取り出すなら、‭‭000000000010 (10進数の2)とANDを取ればよいのです。

C#

1 //1~12時に対応したチェックボックスの配列 2 CheckBox[] checks = 3 { 4 checkBox1, 5 checkBox2, 6 checkBox3, 7 checkBox4, 8 checkBox5, 9 checkBox6, 10 checkBox7, 11 checkBox8, 12 checkBox9, 13 checkBox10, 14 checkBox11, 15 checkBox12 16 }; 17 18 int check_result = 4095; 19 20 //チェックボックス配列のインデックスをビット位置とし、 21 //ビット位置とAND演算した結果が0以外ならチェックを入れる 22 for (int bitPos = 0; bitPos < checks.Length; bitPos++) 23 { 24 checks[bitPos].Checked = (check_result & (1 << bitPos)) != 0; 25 }

投稿2020/05/29 14:29

編集2020/05/29 15:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

lleldigm

2020/05/29 15:36

AND演算って&&という認識ですが、0じゃなければとはどういうことでしょう。 理解が及ばず申し訳ないです。
退会済みユーザー

退会済みユーザー

2020/05/29 15:40

比較演算のANDではなく、ビット演算のANDです。
退会済みユーザー

退会済みユーザー

2020/05/29 15:48

ビット演算は基本的なコンピューターサイエンスの話で、解説すると長くなりますので、Googleで自身で調べてみてください。少なくとも、プログラマーなら基礎知識として知っておいたほうがよいものです。 Windows10をお使いでしたら、電卓のモードをプログラマーにするとビット演算や、2進数⇔10進数の変換を確認できるので試してみるとよいでしょう。
lleldigm

2020/05/29 15:48

ビット演算・・初めて聞きました。先の回答でもあったのでやはりその知識が必要なのですねえ
lleldigm

2020/05/29 15:51

コードまでありがとうございます!少し勉強してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問