处理按位运算符 - 和+ LeftShift - 反向计算

时间:2016-05-24 21:07:17

标签: c# bitwise-operators

看看这些代码:

ns

上层代码以其他方式(更简单):

    const int a = 1 << 0;  // = 1
    const int b = 1 << 1;  // = 2
    const int c = 1 << 2;  // = 4
    const int d = 1 << 3;  // = 8

    int flag = 15;  // = 1 + 2 + 4 + 8

    int e1 = flag & a;  // = 1
    int e2 = flag & b;  // = 2
    int e3 = flag & c;  // = 4
    int e4 = flag & d;  // = 8

    bool b1 = e1 != 0;  // = true
    bool b2 = e2 != 0;  // = true
    bool b3 = e3 != 0;  // = true
    bool b4 = e4 != 0;  // = true   

当我们设置时,我需要反向公式来返回 const int a = 1 << 0; // = 1 const int b = 1 << 1; // = 2 const int c = 1 << 2; // = 4 const int d = 1 << 3; // = 8 int flag = 15; // = 1 + 2 + 4 + 8 bool b1 = (flag & a) != 0; // = true bool b2 = (flag & b) != 0; // = true bool b3 = (flag & c) != 0; // = true bool b4 = (flag & d) != 0; // = true 值:
b1,b2,b3,b4 变量并使它们保持不变。

所以我们有flag种不同的情况。设置2*2*2*2 = 16变量的平均值(true|flase)*(true|flase)*(true|flase)*(true|flase) = 16

我们可以通过哪种方法找出b应该是什么?

意思是:

flag

例如我想要 const int a = 1 << 0; // = 1 const int b = 1 << 1; // = 2 const int c = 1 << 2; // = 4 const int d = 1 << 3; // = 8 int flag = ?; bool b1 = (? & a) != 0; // = true > I WANT b1 True bool b2 = (? & b) != 0; // = false > I WANT b2 False bool b3 = (? & c) != 0; // = true > I WANT b3 True bool b4 = (? & d) != 0; // = false > I WANT b4 False 。那么旗帜是什么? 或
我想要b1 True , b2 False , b3 True , b4 False。那么旗帜是什么? 你是怎么找到它并给我一个计算它的方法!

<小时/> 在我的示例中,b1 False, b2 False , b3 True , b4 False是15(a + b + c + d的总和),这样所有flag变量都为真。
相关:Bitwise operations | And | Which situation is true or false in c#

1 个答案:

答案 0 :(得分:2)

使用按位或(flag)运算使用您想要设置的值设置|变量:

如果您希望b1b4trueb2 y b3false

int flag = a | d; 

bool b1 = (flag & a) != 0;  // = true
bool b2 = (flag & b) != 0;  // = false
bool b3 = (flag & c) != 0;  // = false
bool b4 = (flag & d) != 0;  // = true 

如果您只想b3 true

int flag = c; 

bool b1 = (flag & a) != 0;  // = false
bool b2 = (flag & b) != 0;  // = false
bool b3 = (flag & c) != 0;  // = true
bool b4 = (flag & d) != 0;  // = false 

如果您有b个值并想要标记:

int flag = (b1 ? a : 0) | (b2 ? b : 0) | (b3 ? c : 0) | (b4 ? d : 0);