2010-06-23 70 views
2
#define OUTGOING_MASK   0x0c 
#define OUTGOING_DISABLED  0x04 
#define OUTGOING_ENABLED  0x08 
#define OUTGOING_AUTO   0x00 
#define REFER_SUPPORTED  0x80 

假设support是int类型的某个值。 我有一个getter函数C++中的按位设置

int get() 
{ 
if(OUTGOING_DISABLED == support & OUTGOING_MASK) 
return 1; 
else if(OUTGOING_ENABLED == support & OUTGOING_MASK) 
return 2; 
else if(OUTGOING_AUTO == support & OUTGOING_MASK) 
return 3; 
} 

我需要写像

void set(int val) 
{ 
if(val ==1) 
//todo 
else if(value == 2) 
//todo 
else if(value == 3) 
//todo 
} 

此设置函数如何写getter和setter功能呢? 我需要在这里获取/设置support变量

REFER_SUPPORTED将始终设置为support

+0

b仍然包含即使会后声明b的值。你想用b的价值做什么?打印b的值? – progrmr 2010-06-23 05:34:18

+0

给定a2和a1等于b&a2,是否要恢复b的值? – Donotalo 2010-06-23 05:52:21

+0

是否有你为什么要返回1,2,3而不是OUTGOING_DISABLED,OUTGOING_ENABLED和OUTGOING_AUTO的原因? – 2010-06-23 09:49:13

回答

6

我有一个声明,如a1 = b & a2;如何使用按位运算符知道b的值?

除非设置了ALL位,否则无法恢复b的值。 “&”是不可逆的。

说明。 &操作有如下表:

a b result 
1 & 1 = 1 
0 & 1 = 0 
1 & 0 = 0 
0 & 0 = 0 

这意味着,恢复B,你可以尝试使用下表:

a result b 
0 0  unknown - could be 1 or 0 
0 1  invalid/impossible - could not happen 
1 0  0 
1 1  1 

正如你可以看到它是不可能的猜测b在所有情况下, 。

在表达式a = & b = c中,如果知道c和a,则不能恢复b,因为对于c的每个零位,并且如果a的对应位也为零,则有两种可能的状态b的相应位。您可以可靠地恢复仅b如果的每一位被设置为1

3

你不知道。一般而言,只有a1a2才能恢复该信息。要看到这一点,请考虑a2 == 0的情况。 b & 0始终为0

+0

谢谢马修。在我的代码中,a2永远不会是零。它通常是3或4。那样的话,该怎么办?但a1可以为零 – Sunil 2010-06-23 05:22:30

+0

你仍然不能。举例来说,'8&3'和'4&3'都是0。 – 2010-06-23 05:26:03

+0

仍然无法完成。你为什么觉得你需要这个? – Artelius 2010-06-23 05:26:30

1

你可以使用下面的代码打印出来的二进制相当于

void printBit(int n) 
{ 
    unsigned int i; 
    i = 1<<(sizeof(n) * 8 - 1); 

    while (i > 0) 
    { 
    if (n & i) 
    { 
     printf("1"); 
    } 
    else 
    { 
     printf("0"); 
    } 
    i >>= 1; 
} 
} 

这将简单地打印出“B”的二进制数。那是你想要做的吗?

+0

不,我不想要b的二进制等价物。我只想要b – Sunil 2010-06-23 05:26:22

+0

的价值,我认为你需要对“价值”的含义有更清楚的了解。 – IntelliChick 2010-06-23 05:28:10

2

是以下你想要什么:

void set(int val) 
{ 
    support &= ~OUTGOING_MASK; 
    support |= REFER_SUPPORTED; 

    if(val == 1) 
    { 
     support |= OUTGOING_DISABLED; 
    } 
    else if(value == 2) 
    { 
     support |= OUTGOING_ENABLED; 
    } 
    else if(value == 3) 
    { 
     support |= OUTGOING_AUTO; 
    } 
} 

如果是这样的话,那么我相信你getter函数也错误。按照我的理解,应该是如下:

int get() 
{ 
    if(OUTGOING_DISABLED == ((support & OUTGOING_MASK) >> 2)) 
     return 1; 
    else if(OUTGOING_ENABLED == ((support & OUTGOING_MASK) >> 2)) 
     return 2; 
    else if(OUTGOING_AUTO == ((support & OUTGOING_MASK) >> 2)) 
     return 3; 
} 

+0

是啊...但我有另一个叫 #define REFER_SUPPORTED 0x80 它将始终设置为支持 – Sunil 2010-06-23 06:31:38

+0

请检查我更新的答案。以前我错了。 – Donotalo 2010-06-23 09:38:04

+0

谢谢。你还可以根据制定者写下吸气剂吗? – Sunil 2010-06-24 10:23:29