一元运算符'&'工作
本文关键字:工作 运算符 一元 | 更新日期: 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 & 100
为0b110010 & 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。