为什么(Math.Pow(2,x)&(2 ^ y + 2 ^ z + 2 ^ i))总是返回0

时间:2014-02-21 06:44:38

标签: c# operators

就像标题一样,我不明白为什么这个表达总是如此?

以下是详细信息:

// 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.所以今天不是,上床睡觉

9 个答案:

答案 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)

xyzt视为位位置 - 您正在执行按位&,这将清除任何位设置两个操作数,2 t 设置t位。

因此,如果xyz都不同,则2 x + 2 y + 2 z 将设置位xyz,并且2 t 将设置位t ...所以对两个结果执行按位AND运算将始终为0。

现在您的原始声明(未指明xyz不同)并非完全为真,因为{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