前提
C言語でトラックナンバーの表示、曲名を乱数でランダムに表示するプログラムを書いたのですが、
分からない部分があるので質問させてください。
実現したいこと
ソースコードの改善
発生している問題・エラーメッセージ
if文の
!(hist & hnum)
こちらの意味が理解できません。乱数によって一度表示された余りが被った場合どういう理屈でfalseになるのでしょうか??
~0100
&
~0100
これがビット論理積で~0100になって!でビット反転して~1011になるってことですよね??
これでなぜfalseになるかが分からないです。
該当のソースコード
C言語
1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5 6int main(void) 7{ 8 9 long lnum = 0; 10 int tnum = 0; 11 unsigned short x1 = 1; 12 unsigned short hnum = 0; 13 int i = 0; 14 unsigned short hist = 0; 15 char diskinfo[16][64] = 16 { 17 "夏色", "春色", "冬色", "秋色", 18 "A WOO", "残響散歌", "朝が来る", "昼も来る", 19 "夜が来た", "心という名の不可解", "また逢う日まで", "一平ちゃんの歌", 20 "出前一丁の歌", "君が見た夢の物語", "鼻から牛乳", "目から牛乳", 21 }; 22 23 srand( time(NULL)); //乱数生成 24 do //処理をしてからwhileでループ判断 25 { 26 lnum = rand(); //乱数を代入 27 tnum = (int)(lnum % 16); //0から15の余りをintキャストして代入 28 hnum = x1 << tnum; //余りの分を左シフト 29 30 if( !(hist & hnum)) //ビット論理積(否定)全て1になるまで偽にならない 31 { 32 i++; //トラックカウント 33 printf("%d:%s\n", i, diskinfo[tnum]); //トラック、曲名を二次元配列で表示 34 hist = hist | hnum; //ビット論理和をhistに代入 35 } 36 } 37 while(hist != 0xffff); //全てに1が立ってない場合はループする 38 39 40 return (0); 41} 42
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
VMware
Ubuntu 16.04 LTS

回答2件
あなたの回答
tips
プレビュー