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);

そのコードは知っていますが、これらの記号 &,| が何を意味していたのかはわかりません。そして〜。
これらは意味がありますか ( and , or , not ) ですか、それとも間違っていますか?

4

7 に答える 7

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)

これは、フォントを太字にしたいということです。存在する値と OR することによって (これは、既に太字になっているものは太字のままであることも意味します)。

(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
于 2012-04-16T20:59:35.657 に答える
1

はい、

& は論理積です。

| | 論理または

説明については、これらのリンクを確認してください。

すべての C# 演算子の説明を表示するには、ここをクリックしてください

于 2012-04-16T20:50:59.470 に答える
1

それらはビットごとの操作です。 |OR&は AND であり、~NOT です。

列挙型のフラグを比較しているので、それらのそれぞれ ( StyleBoldなど) は 2 の累乗の数値です。このようなフラグを使用したビット操作の魔法は、2 つのフラグのビットごとの OR で 2 つのビットが設定されることです。ビット マスキングを使用することで、どの値を OR 演算したか、または特定の「列挙」が使用されたかどうかを誰かが把握できます。

Style最初の行はtrue に設定されたフォントを要求しており、それは NOTBoldです。

Style2 つ目は、 ORでフォントを探していBoldます。

于 2012-04-16T20:51:47.973 に答える
0

そうです、それらは論理的なビット単位の演算子です。

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

全体的なスタイルから太字属性を削除する効果があります (これらは、私が始めたときは常に少し後ろ向きに見え、それを取り除くには何かを AND する必要がありましたが、慣れるでしょう)。

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

ORing は太字の列挙型をスタイルに追加します。

少し読んでから、紙で何が起こっているのかを理解してください。これは非常に巧妙で、この種のコーディングはいたるところで使用されています。

于 2012-04-16T20:50:51.543 に答える
0

これらは、ビットごとの論理演算子です。

これ:

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

古いフォント スタイルを採用し、すべてのビット EXCEPT (ビット否定) 太字でビットごとの AND を実行して太字を削除します。

ただし、これ:

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

FontStyle.Bold で表されるビットを設定しています。

于 2012-04-16T20:51:04.930 に答える
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
}
于 2012-04-16T20:55:56.330 に答える
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)

ここではシングルバイトを使用しましたが、マルチバイト値でも機能します。

于 2012-04-16T20:53:04.783 に答える