1. 論理代数の基礎:
1. 数字は2進数で表され、取り得る数字はすべて0と1のみです。
2. 基本的な操作は「and」、「or」、「not」の 3 つだけです。
AND演算は次のように定義されます(AND演算を表現するには&を使用します)
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
単純に理解すると、掛け算と同じように、0がある限り結果は0になります。
OR演算は次のように定義されます: (AND演算を表すには|を使用します)
0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
単純に理解すると、1がある限り、結果は1になる、足し算と同じです。
2. 論理演算の例:
01111010101010101111111111111111 & 1100000 = 1100000
一般的には次のように理解できます:
数値のN桁の値を取得したい場合は、数値と2のN-1乗(マスク)をANDするだけです。
3. データベースフィールド定義:
データテーブル binary_sample を例に挙げます:
テーブル binary_sample(
を作成)uid int unsigned not null,
ステータス int unsigned not null デフォルト 0,
主キー(uid)、
キーi_s(ステータス)
)engine=innodb;
ステータスフィールドの定義:
ステータスフィールドのデータ型は32ビット整数で、できるだけ多くの属性を格納するために、次のように定義します。
以下のすべての「ビット」の記述順序は、下位から上位(右から左)に表現されます。数字0~2はユーザー登録状況を示します:
000は新規登録が承認されていないことを意味します
001は登録が承認されたことを意味します
010は上級ユーザーを意味します
011は管理者を意味します
100はスーパー管理者を意味します
101予約済み
110予約済み
111マスク
3~5人のユーザーの性別:
000は性別の不確実性を示します
001は性別が男性であることを示します
010は性別が女性であることを示します
011予約済み
100予約
101予約済み
110予約済み
111マスク
すべての男性ユーザーをクエリしたい場合:
select * from binary_sample where status & b111000 = b001000;
すべての管理者ユーザーをクエリしたい場合:
select * from binary_sample where status & b111 = b011;
すべての男性管理者ユーザーをクエリしたい場合:
select * from binary_sample where status & b111111 = b001011;
承認されていない新規登録以外のすべてのユーザーをクエリしたい場合は、次のようになります。
select * from binary_sample where status & b111 != b000;
4、PHPプログラムを使用してこのような計算を実行します:
define("USER_NEW",0);//000
define("USER_NORMAL",1);//001
define("USER_ADVANCE",2);//010
define("USER_MANAGE",3);//011
define("USER_SUPER",4);//100
define("USER_MASK",7);//111
define("GENDER_UNKNOWN",0);// 000000
define("GENDER_MALE",8);// 001000
define("GENDER_FEMALE",9);// 010000
define("GENDER_MASK",56);//111000
すべての男性ユーザーをクエリしたい場合:
$status=GENDER_MALE;
$mask=GENDER_MASK;
$sql="select * from binary_sample where status & ${mask} = ${status}";
すべての管理者ユーザーをクエリしたい場合:
$status=USER_MANAGE;
$mask=USER_MASK;
$sql="select * from binary_sample where status & ${mask} = ${status}";
すべての男性管理者ユーザーをクエリしたい場合:
$status=GENDER_MALE & USER_MANAGE;
$mask = GENDER_MASK & GENDER_MASK;
$sql="select * from binary_sample where status & ${mask} = ${status}";
新規登録および未承認のユーザー以外のすべてのユーザーをクエリしたい場合は、次のようにします。
$status = USER_NEW;$mask = USER_MASK;
$sql="select * from binary_sample where status & ${mask} != ${status}";
類推すると、それぞれの値の意味が定義されていれば、クエリは基本的に解決されます。
http://www.bkjia.com/PHPjc/478751.html