C言語のif文の中のビット論理積が分かりません。

前提

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

コメントを投稿

0 コメント