2012-04-16 9 views
3

は私が(&〜|)を使用フォントクラス

Font oldf; 
Font newf; 

oldf = this.richText.SelectionFont; 

if (oldf.Bold) 
    newf = new Font(oldf, oldf.Style & ~FontStyle.Bold); 
else 
    newf = new Font(oldf, oldf.Style | FontStyle.Bold); 

は私がそのコードを次のコードを知っているが、私はそれがこれらの記号&を意味したかわかりません、| 〜と。
はこれらの平均です(と、またはそうではありません)または私は間違っていますか?

答えて

1

他にも述べたように、ビット演算子です。 FontStyleはビットフィールド(フラグのセット)です。


oldf.Style & ~FontStyle.Bold 

これは「大胆な取り外し」を意味しますが、基礎となる数学を見て、あなたはこのような何かを得ます。

(a) FontStyle.Bold = 0b00000010; // just a guess, it doesn't really matter 
(b) oldf.Style  = 0b11100111; // random mix here 
// we want Bold "unset" 
(c) ~FontStyle.Bold = 0b11111101; 
=> (b) & (c)  = 0b11100101; // oldf without Bold 

new Font(oldf, oldf.Style | FontStyle.Bold) 

これは、我々が太字フォントにしたいということを意味します。これを既存の値と論理和することによって(すでに太字になっているものは太字で表示されます)。

(a) FontStyle.Bold = 0b00000010; // just a guess, it doesn't really matter 
(b) oldf.Style  = 0b11100000; // random mix here 
=> (b) | (c)  = 0b11100010; // oldf with Bold 
0

これは論理的なビット演算子です。

new Font(oldf, oldf.Style & ~FontStyle.Bold); 

あなたの全体的なスタイル(私が始めたとき、これらは常にを有する、それを取り除くために何か、私には少し後方に見えたが、あなたがそれに慣れるだろうから、大胆な属性を除去する効果があります)。

new Font(oldf, oldf.Style | FontStyle.Bold); 

ORingは、あなたのスタイルに大胆な列挙型を追加します。

少し紙を使って何が起こっているのかを読んで、それを解決してください。それはかなり巧みで、この種のコーディングはすべての場所で使用されています。

0

彼らは、論理ビット演算子です。

この:

newf = new Font(oldf, oldf.Style & ~FontStyle.Bold); 

は古いフォントスタイルを取って、ビット単位で実行することにより、大胆な(ビット単位の否定)を除くすべてのビットで大胆削除しています。

しかし、この:

newf = new Font(oldf, oldf.Style | FontStyle.Bold); 

はFontStyle.Boldによって表されるビットを設定しています。

1

ビット単位の操作です。 |はOR &はANDで、~はNOTです。

あなたは列挙のフラグを比較しているので、それらの各フラグ(StyleBoldなど)は2の累乗である数値です。そのようなフラグを使ったビット操作の魔法は、2つのフラグのビットごとの論理和に2ビットが設定されるということです。ビットマスキングを使用することで、あなたが一緒にORした値、または特定の「列挙」が使用されたかどうかを知ることができます。

最初の行は、Styleがtrueに設定されたフォントを要求していますが、それはBoldではありません。

StyleまたはBoldのフォントを探しています。

0

ものはビット演算子である:http://msdn.microsoft.com/en-us/library/6a71f45d%28v=vs.71%29.aspx

は基本的に、それらはビットレベルで動作(行「論理(論理値とビット単位)」)。 &はAND、| OR、〜はNOTです。ここに例があります:

00000001b & 00000011b == 00000001b (any bits contained by both bytes) 
00000001b | 00001000b == 00001001b (any bits contained in either byte) 
~00000001b == 11111110b (toggle all bits) 

ここでは1バイトを使用しましたが、マルチバイト値でも使用できます。

0

変数はビットフラグ列挙です。したがって、ビット単位のAND演算子 "$"またはORとビット単位のOR演算子 "|"を一緒に使用できます。

列挙型で使用されているので、以下の複数のオプションの例を指定できます。

[Flags] 
enum Numbers { 
    one = 1 // 001 
    two = 2 // 010 
    three = 4 // 100 
} 

var holder = Numbers.two | Numbers.one; //one | two == 011 

if ((holder & Numbers.one) == Numbers.one) { 
    //Hit 
} 

if ((holder & Numbers.two) == Numbers.two) { 
    //Hit 
} 

if ((holder & Numbers.three) == Numbers.three) { 
    //Not hit in this example 
} 
関連する問題