C# 为什么(Math.Pow(2,x)&;(2^y+;2^z+;2^i))总是返回0
就像标题一样,我不明白为什么这个表达总是正确的 详情如下:C# 为什么(Math.Pow(2,x)&;(2^y+;2^z+;2^i))总是返回0,c#,operators,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 resu
// 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
我有一个星期几的清单。我想挑一天和我的朋友出去。如果今天不选,我哪儿也不去
某些预定义值:日期:周一周二周三周四周五周六周日
数值:1-2-3-4-5-6-7 我将选择Mon、Tue和Fri将值保存到我的数据库中 我将保存38(2^1+2^2+2^5),而不是保存{1,2,5} 如果今天是星期二,我会这样检查:2^2&38=4。4等于0,所以今天就是好日子,出去吧 如果今天是星期三,我会这样检查:2^3&38=0。所以今天不是,去睡觉吧,因为:
total = 14
Math(2,4) = 16
16 and 14 = 0
这是二进制操作
16 = (10000) binary
14 = (01110) binary
它们之间没有公共位,因此和将返回0。如果您期望其他结果,您可能想执行或
16 or 14 = 30
将x
、y
、z
和t
视为位位置-执行按位&
操作时,将清除两个操作数中未设置的任何位,2t将只设置t
第位
因此,如果x
、y
和z
都不同,2x+2y+2z将设置位x
、y
和z
,2t将设置位t
。。。因此,对这两个结果执行按位AND运算将始终得到0
现在,您最初的声明(没有指定x
、y
和z
是不同的)并不完全正确,因为如果x
和y
是相同的(例如),那么添加可以有效地为您提供不同的位。(每个仅具有一个位集的整数值之和仅相当于按位或如果操作数都具有不同的位集。)
例如:
int x = 2;
int y = 2;
int z = 10; // Ignore this, effectively
// 2^2 + 2^2 + 2^10 == 2^3 + 2^10
int total = (int)Math.Pow(2, x) + (int)Math.Pow(2, y) + (int)Math.Pow(2, z);
int t = 3;
int result = (int)Math.Pow(2, t) & total; // result is now 8
如果你把它看成是二进制的,只要x,y,z是不同的数字,结果是
(int)Math.Pow(2, x) + (int)Math.Pow(2, y) + (int)Math.Pow(2, z)
是设置了位x、y和z(且仅设置了这些位)的整数
…检查是否设置了位t。只要t与x、y、z不同,它就不是。这是一个二进制比较(&
比较两个数字中的每个位置,如果两者都是1,则返回1):
使用其他值,您将得到不同的值。例如,以6和10为例:
00101 // 6 in binary
01110 // 14 in binary
00100 // 6 and 14 = 8
PS:您可以使用电脑上的计算器,通过选择View>Programmer,并在左侧的Bin和Dec之间切换,来尝试这类数学 &执行二进制AND运算,因此16和14的二进制加法为0
10000
& 01110
-------
00000
所以
在这里,您使用&来执行二进制操作。
这&等于按位AND(与门)。就像这样
When 1 & 1 =1
when 1 & 0 = 0
when 0 & 1 = 0
when 0 & 0 = 0
当匹配值满足时,它将输出1,否则将输出0
所以binary 1000的值是8,要真正理解这里发生的事情,必须首先理解binary,因为使用&
所做的是一个简单的过程
所以,在我们写数字的正常方式中,我们使用十进制,或10进制。您从0到9进行计数,然后在另一个数字前面加上前缀以表示“溢出”:10。在二进制或基数为2的情况下,我们只能先数到0或1,然后才必须预加另一个数。例如,从0到4,我们有二进制:0=0,1=1,2=10,3=11,4=100。这些0或1中的每一个都是位,计算机很容易用这些位进行计算,因为它可以将它们表示为打开或关闭的晶体管
你在这里做的是生成基本上是1的数字,其中有很多二进制的零。你会注意到,如果你做10^x(Math.Pow(10,x)
),你会得到10的倍数和很多零:10100,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仍然只有100)。其计算结果为0000=0
您注意到,当t为x、y或z时,它分别返回x、y或z,有效地起到过滤器的作用,因为:0010&0111=0010(两个都在第二个位置)。更复杂的例子是01101100&1100 0101=0100100 0100
在那里;现在您可以计算您的计算机所做的:-)
&是二进制和,可以看作是每个位之间的乘法
所以
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
然后
这是错误的,我编辑了它:请注意,在0
和31
之间使用一个整数a
,而不是(int)Math.Pow(2,a)
,你可以只使用1,如果a
超过31,则(int)
强制转换将打乱Math.Pow
的输出。是的,这正是我所说的例子(int)(打字速度比long快:P)谢谢你的回复,但我认为这不是一个答案。我知道它总是返回0。我需要这样的东西:。它总是正确的,我们不需要再次证明它=。=@Trung你的意思是,你需要检查a^2+b^2=c^2吗?不,这只是关于我在DB中管理数据的问题。我会编辑我的问题。hhmm,我认为你在这里有些错误,因为输入法,加上另一个值,它将不仅仅是0或1。例如:t=3,结果将是8是,我的朋友。当t=3时,它是9和14。这意味着1001110-----
(10000) // 16
(01110) // 14
(00000) // 16 & 14 = 0
When 1 & 1 =1
when 1 & 0 = 0
when 0 & 1 = 0
when 0 & 0 = 0
1001
1110
------
1000
------
(int)Math.Pow(2, t) = (2^4)base 10 = (10000)base 2
total = (2^3 + 2^2 + 2^1)base 10 = (01110)base 2
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