就像标题一样,我不明白为什么这个表达总是如此?
以下是详细信息:
// x, y, z, t is always different with each other
int x = 1;
int y = 2;
int z = 3;
int total = (int)Math.Pow(2, x) + (int)Math.Pow(2, y) + (int)Math.Pow(2, z);
int t = 4; // or any number which is not x, y, z
int result = (int)Math.Pow(2, t) & total;
结果总是= 0
有人可以解释一下吗?
以下是如何将此表达式应用到我的代码中的一些示例:P。
我有星期几的列表。我想抽一天和朋友出去玩。如果今天没有被选中,生病不会去任何地方:D
一些预先定义的值:
日:星期一至星期三 - 星期四 - 星期五 - 星期六 - 星期日 -
值:1-2-3-4-5-6-7
我会选择Mon,Tue和Fri将值保存到我的数据库中。
而不是保存{1,2,5},生病保存38(2 ^ 1 + 2 ^ 2 + 2 ^ 5)。
如果今天是星期二,我会像这样检查:2 ^ 2& 38 = 4. 4是#0所以今天是出去的日子。
如果今天是星期三,我会这样检查:2 ^ 3& 38 = 0.所以今天不是,上床睡觉
答案 0 :(得分:4)
如果您将其视为二进制,并且只要x,y,z是不同的数字,则结果为;
(int)Math.Pow(2, x) + (int)Math.Pow(2, y) + (int)Math.Pow(2, z)
是一个整数,位x,y和z(只有那些位)设置。
(int)Math.Pow(2, t) & total
...检查是否设置了位t。只要t不同于x,y,z,它就不会。
答案 1 :(得分:4)
要真正理解这里发生的事情,您必须先了解二进制,因为您对&
所做的事情是bitwise-and。
因此,按照我们编写数字的常规方式,我们使用十进制系统或base-10系统。您从0到9计数,然后添加另一个数字以指示“溢出”:10。在二进制或base-2中,我们只能计算0或1,然后才能添加另一个数字。因此,例如,从0到4计数,我们有二进制:0 = 0,1 = 1,2 = 10,3 = 11,4 = 100.这些零或1中的每一个都是位,这对于计算机计算,因为它可以表示它们是一个开关晶体管开关。
你在这里做的是生成基本为1的数字,其中包含大量的二进制零。你会注意到,如果你做10 ^ x(Math.Pow(10, x)
),你会得到10的倍数和很多零:10,100,1000,10000等。
2 ^ x(Math.Pow(2, x)
)做同样的事情:它生成二进制数字1,10,100,1000,10000。在我们的十进制表示法中,这些二进制数字转换为1分别为,2,4,8,16。
现在&
(按位AND)的作用是返回二进制代码,其中左边的所有代码也是右边的代码。所以,假设你有二进制:2 ^ 1 + 2 ^ 2 + 2 ^ 3 = 1 + 10 + 100 = 111。
你做了一个按位操作,左边是2 ^ 4,这是1000.所以你要问的是1000& 0111(您可以在任何二进制代码的左侧添加尽可能多的零,就像使用十进制数字一样:00100仍然只有一百)。评估结果为0000 = 0。
你注意到当t是x,y或z时,它分别返回x,y或z,有效地起到过滤器的作用,因为,好吧:0010& 0111 = 0010(第二个位置都有ONES)。一个更复杂的例子是0110 1100& 1100 0101 = 0100 0100。
有;现在你可以计算你的电脑了: - )
答案 2 :(得分:3)
这是因为:
total = 14
Math(2,4) = 16
16 and 14 = 0
这是二元操作!
16 = (10000) binary
14 = (01110) binary
它们之间没有共同点,因此and
将返回0.如果您预期结果可能是您想要or
?
16 or 14 = 30
答案 3 :(得分:3)
将x
,y
,z
和t
视为位位置 - 您正在执行按位&
,这将清除任何位设置两个操作数,2 t 仅 设置t
位。
因此,如果x
,y
和z
都不同,则2 x + 2 y + 2 z 将设置位x
,y
和z
,并且2 t 将设置位t
...所以对两个结果执行按位AND运算将始终为0。
现在您的原始声明(未指明x
,y
和z
不同)并非完全为真,因为{if { {1}}和x
相同(例如)添加可以有效地为您提供不同的位。 (如果操作数都设置了不同的位,则添加整数值,每个值只有一个位设置仅等效于按位或。)
例如:
y
答案 4 :(得分:3)
它是二进制比较(&
比较两个数字中的每个位置,如果两者都是1,则返回1):
10000 // 16 in binary
01110 // 14 in binary
00000 // 14 & 16 = 0
改为使用其他值,您将获得不同的值。拿,例如6和10:
00101 // 6 in binary
01110 // 14 in binary
00100 // 6 and 14 = 8
PS:您可以使用计算机在PC上通过选择查看>来体验此类数学运算程序员,并在左侧切换Bin和Dec。
答案 5 :(得分:1)
&安培;二进制AND操作以及16和14的二进制ADD是否为0
10000
& 01110
-------
00000
答案 6 :(得分:1)
total = 14
Math(2,4) = 16
所以
(10000) // 16
(01110) // 14
(00000) // 16 & 14 = 0
答案 7 :(得分:1)
(int)Math.Pow(2, t) = (2^4)base 10 = (10000)base 2
total = (2^3 + 2^2 + 2^1)base 10 = (01110)base 2
& 是二进制AND ,可以视为每个位之间的乘法
因此
1*0 = 0
0*1 = 0
0*1 = 0
0*1 = 0
0*0 = 0
(int)Math.Pow(2, t) & total = (10000)base 2 & (01110)base 2 = (00000)base 2 = 0
假设我们有
total1 = (10001)base 2
然后
(int)Math.Pow(2, t) & total1 = (10000)base 2 & (10001)base 2 = (10000)base 2 = (16)base 10
答案 8 :(得分:0)
这里使用&进行二进制操作。 这&等于按位AND(与门)。和这样的工作。
When 1 & 1 =1
when 1 & 0 = 0
when 0 & 1 = 0
when 0 & 0 = 0
当满足匹配值时,它将输出1,否则它将输出0. Check how and works
1001
1110
------
1000
------
所以二进制1000的值是8