一元运算符'&'工作

本文关键字:工作 运算符 一元 | 更新日期: 2023-09-27 18:11:33

一元运算符'&'是如何工作的?

在一个测试项目中,我运行了以下代码:

int num = 50, num2 = 100;
int x = num & num2;

result: x = 32

 int num = 100, num2 = 90;
 int x = num & num2; 

result:x = 64

一元运算符'&'工作

From MSDN:

二进制,操作符是为整型和bool类型预定义的。为整型,&计算其操作数的逻辑位与。对于bool操作数,&计算其操作数的逻辑与;那则当且仅当两个操作数都为真,结果为真。

在你的例子中,它是整型版本。

:

 50 in binary is 00110010     
100 in binary is 01100100     
AND result is    00100000 (32 dec)

位运算符对位进行逐位运算。

二元与运算符将两个操作数中都存在的位拷贝到结果中。

(A & B) = 12, i.e., 0000 1100

二进制值

50 (10 ) = 0110010  (2)
100 (10) = 1100100  (2)

并且使用逻辑与,所以只有两个值都为1的位现在是1,结果是:

0100000 (2) = 32 (10)

100 (10) = 1100100  (2)
AND
90 (10) =  1011010 (2)
------------------------
64 (10) =  1000000(2)

首先:&在这个上下文中是一个二进制运算符,因为它有两个参数。不这是一元运营商。

带两个参数的&是位与操作符。

50 & 1000b110010 & 0b1100100。对每个比特应用&,得到0b100000,它是32。

您可以类似地分析100 & 90

将这两个数字表示为二进制(以便在按位进行操作时清楚地看到),并查看发生了什么:

private static String AndExplanation(int left, int right) {
  String x = Convert.ToString(left, 2);
  String y = Convert.ToString(right, 2);
  String z = Convert.ToString(left & right, 2);
  int length = Math.Max(x.Length, y.Length);
  return String.Join(Environment.NewLine,
    $"{x.PadLeft(length, '0')} ({left}) &",
    $"{y.PadLeft(length, '0')} ({right})",
    new String('-', length),
    $"{z.PadLeft(length, '0')} ({left & right})"
  );
}

测试
Console.Write(AndExplanation(50, 100));
Console.Write(AndExplanation(90, 100));

你会看到:

0110010 (50) &
1100100 (100)
-------
0100000 (32)

1011010 (90) &
1100100 (100)
-------
1000000 (64)

简短的回答是——看情况。

对于整数,就像你的例子一样,它做位操作。因此,01100100 (100) bitwise AND 00110010 (50) = 00100000 (32).

对于布尔值,这是一个急切的AND(总是计算两个表达式)-不像懒惰的AND &&,如果第一个表达式是false,则不计算第二个表达式

这是一个位与运算:

在"0b0110010 AND 0b1100100"中,您应该查找在公共位置共享的1和0,从而得到0b0100000=32。

同样适用于"100 AND 90",得到0b1000000=64。

希望有帮助。

是位运算符。50的位(二进制)是110010,100是1100100,当您对齐它们(向右对齐)时,您得到 110010 1100100

,算子的工作方式是这样的,在每个位置,如果两条线都是1,你得到1,否则你得到0,如下所示。 110010 1100100 ||||||| 0100000 所以你得到二进制结果100000,也就是32。