背景
を切り替える、私の代わりに私がすべて保存単一int
列を、使用していますブーリアンのうち、ビットワイズ演算子を使用して圧縮されています。ビット単位の圧縮ブール - 私は、データベース内の真/偽の値の数を格納し、むしろより多くの列を作るために持っている特定のもの
例:だからDBに、certs
列で、Iは13
に1
、0
、1
、1
(1 + 4 +を圧縮したい
Lead Free - Yes
Gluton Free - No
Free Range - Yes
Organic - Yes
:
Product 1
は次のように認定され8)。
私はこの情報を圧縮して抽出するためのクイックラッパー関数を書いています(int
からboolean
に配列して戻す)。
問題
私はすぐにこれから値を追加および削除するための最良の方法のかわかりません。製品を私が自由範囲ではなくなるように更新したいとします。私は圧縮されたint、マイナス4
を取ることができます。それは動作します。それが既にフリーレンジでなかったら何を除いて?私が一括処理をしている場合、私は、現在Free Rangeと認定されている製品から4
を取り除くだけの機能が必要です。
私はそれが長すぎるif
ステートメントでそれを理解しましたが、それはエレガントではありません。これは動作します:
// $certs_current is the compressed int from the DB.
// $certs_new is a new integer. 4 would mean toggle "Free Range" to true. -4 would mean toggle it to false.
if ($certs_current & abs($certs_new)) {
if ($certs_new < 0) {
$certs_current += $certs_new;
}
} else {
if ($certs_new > 0) {
$certs_current += $certs_new;
}
}
これは多くのif
ステートメントです。私は|
演算子で遊んだが、正の数を加えるためにしか働かない。それを-4
に渡すと、破損します。そして、私はnor
演算子を見つけることができません。
これを行うより良い方法はありますか?
編集:私はそれを13
と-4
を与えると、それは私を9
あげる:つまり
、オペレータがあります。しかし、もし私が9
と-4
とすれば、それは9
になるでしょうか?あるいは、ちょうど13
と4
でも。私の作業ロジックに|
に追加
編集2
、私は複雑さを低減してきましたし、まだそれが働いています。新しい番号が正の場合
if ($certs_new > 0) {
$certs_current = ($certs_current | $certs_new);
} else {
if ($certs_current & abs($certs_new)) {
$certs_current += $certs_new;
}
}
を基本的には、言います追加する必要がある場合は、|
演算子を使用して追加します。否定的な場合は、最初に削除する必要があるかどうかを確認し、削除する必要がある場合は削除します。私が改善できると思う場所はどこですか。4
がすでにtrueに切り替えされていない場合にのみ(私はそれを記述するための奇妙な方法です実現)4
を追加するため
|
は、if
文を置き換えます。
しかし、負の数では、私は可能な場合には削除したい文である入れ子のif
ステートメントをまだ持っています。
はそう。 –
私はそれを考慮しましたが、認定には自分自身に関連する情報はありません。それらは真の虚偽値です。 –