簡體   English   中英

C ++中的按位設置

[英]Bitwise setting in C++

#define OUTGOING_MASK         0x0c
#define OUTGOING_DISABLED     0x04
#define OUTGOING_ENABLED      0x08
#define OUTGOING_AUTO         0x00
#define REFER_SUPPORTED       0x80 

假設support是int類型的一些值。 我有一個getter功能

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;
}

我需要為此編寫set函數

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

如何為此編寫getter和setter函數? 我需要在這里獲取/設置support變量

REFER_SUPPORTED將始終設置為support

我有一個聲明,如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的相應位有兩種可能的狀態。 。 只有當a的每個位都設置為1時,才能可靠地恢復b。

你沒有。 通常,只有a1a2才能恢復該信息。 要看到這一點,請考慮a2 == 0的情況。 b & 0始終為0。

以下是您想要的:

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; }
 
 
  

您可以使用以下代碼打印出二進制等效項

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'。 那是你想做的嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM