簡體   English   中英

C++ 按位布爾值

[英]C++ bitwise bools

我試圖找出一種有效的方法來創建適合字節操作的布爾類型。 例如:

unsigned char TRUE_BOOL = ~unsigned char(0);
unsigned char FALSE_BOOL = unsigned char(0);

現在我想讓以下表達式返回定義的 BOOL 之一 - 因此,例如,如果我使用表達式5 < 10這將返回我的按位 BOOL 之一,而不是標准布爾值。 我希望這樣做是為了能夠用按位運算替換 if 語句:

//---------------parameter definitions
unsigned char a = 10;
unsigned char b = 20;

//---------------if statement approach
if(a < b){
    unsigned char Result = 13;
}else{
    unsigned char Result = 17;
}

//---------------bitwise approach
unsigned char Result = ((a < b) & 13) | ((a >= b) & 17);

有哪些方法可以實現(即返回我的 BOOL 而不是標准)? 我有一些想法,但我想知道是否存在更好的方法。

您可以創建一個自定義布爾類,當隱式轉換為 unsigned int 時,它確實會導致~00 ,如下所示:

class BOOL {
    unsigned int value;

public:
    BOOL(bool value): value(value ? ~0 : 0) {}

    operator unsigned int() {
        return value;
    }
};

然后你可以寫:

unsigned char Result = (BOOL(a < b) & 13) | (BOOL(a >= b) & 17);

哪個做你想要的。 但是,我不建議這樣做,因為編譯器已經為您進行了這些優化。 例如,不使用上述使用&運算符編寫表達式的方式,您可以改為編寫:

unsigned char Result = ((a < b) * 13) | ((a >= b) * 17);

但是正如評論中提到的,缺少if語句並不意味着它不能仍然包含條件分支。 但要注意的一件事是1317之間的差異僅為4你可以這樣寫:

unsigned char Result = 13 + ((a >= b) << 2);

所有這些方法都由編譯器優化以生成完全相同的指令,如godbolt.org 所示

暫無
暫無

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

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