2010-06-23 73 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