【发布时间】:2014-02-21 06:44:37
【问题描述】:
就像标题一样,我不明白为什么这个表达总是正确的?
详情如下:
// 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
我会选择周一、周二和周五的储蓄值到我的数据库中。
不是保存 {1, 2, 5},而是保存 38 (2^1 + 2^2 + 2^5)。
如果今天是星期二,我会这样检查:2^2 & 38 = 4。4 是 #0,所以今天是这一天,出去吧。
如果今天是星期三,我会这样检查:2^3 & 38 = 0。所以今天不是,去睡觉
【问题讨论】:
-
它弄错了,我编辑了它:P
-
请注意,在
0和31之间使用整数a,而不是(int)Math.Pow(2, a),您可以只使用1 << a或(1 << a)。也许这可以帮助您找到问题的答案? -
如果
a超过 31,(int)转换无论如何都会弄乱Math.Pow的输出。 -
是的,这只是一个例子,所以我输入了 (int) (打字速度比 long 快:P)