簡體   English   中英

在 C++17 中表達 std::byte 文字的正確方法是什么?

[英]What is the proper way to express a std::byte literal in C++17?

編譯器警告不要在按位運算中混合使用整數和字節。 我能找到的創建字節文字的最佳方法是構造函數語法byte(1) ,如以下示例代碼的 for 循環所示。 這是最好的方法嗎? (除了定義我自己的文字后綴)

#include<vector>

using namespace std;

void drawMonochromeHLine(vector<byte>& screen, int width, int x1, int x2, int y) {
    if (x2 < x1) swap(x1, x2);
    //DCHECK(x1 >= 0);
    //DCHECK((x2 >> 3) < width)
    //DCHECK(y < height)

    int yOffset = y * (width >> 3);
    int si = (x1 >> 3) + yOffset;
    int ei = (x2 >> 3) + yOffset;
    int sbi = (~x1) & 0b111; // x1=6: 00000011. x1=1: 01111111
    int ebi = (~x2) & 0b111; // x=7: 10000000. x2=1: 01111111

    if (si == ei) {
        for (byte mask = byte(1) << ebi; mask >= byte(1) << sbi; mask >>= 1)
            screen[si] |= mask;
    }
    else {
        for (byte mask = byte(1) << sbi; mask > byte(0); mask >>= 1)
            screen[si] |= mask;
        for (int i = si + 1; i < ei; ++i)
            screen[i] = byte(0xff);
        for (byte mask = byte(1) << 7; mask >= byte(1) << ebi; mask >>= 1)
            screen[ei] |= mask;
    }
}

這是最好的方法嗎?

這是格式不正確的。

std::byte不是整數類型,因此無法對其執行算術運算。 據我所知,它僅可用作可重復使用的其他對象的原始存儲。 即使那樣,它的唯一優點是可以與unsigned char的字符方面(以及積分方面,在這里是您的問題)區分開。

您應該使用整數類型進行算術運算。 如果願意,可以繼續使用std::byte作為元素screen ,但這將增加代碼的冗長性,因為您需要使用std::byte{i}從整數和std::to_integer<SOME_INT_TYPE>(b)進行轉換std::to_integer<SOME_INT_TYPE>(b)換另一種方式。 我建議始終使用unsigned char

您可能應該使用無符號類型而不是int進行按位運算。

是的,最接近文字字節表達式的是 Shawn 提到的byte{0} ,如cppreference std::byte 頁面上的(底部)示例所示。

沒有像 float 或 unsigned 這樣的文字后綴

而不是 byte us uint8_t 那么就不需要文字了。 使用 G++ 11 -std=c++17 編譯。

#include <cstdint>
#include <vector>

using namespace std;

void drawMonochromeHLine(vector<uint8_t>& screen, int width, int x1, int x2, int y) {
    if (x2 < x1)
        swap(x1, x2);
    //DCHECK(x1 >= 0);
    //DCHECK((x2 >> 3) < width)
    //DCHECK(y < height)

    int yOffset = y * (width >> 3);
    int si = (x1 >> 3) + yOffset;
    int ei = (x2 >> 3) + yOffset;
    int sbi = (~x1) & 0b111;    // x1=6: 00000011. x1=1: 01111111
    int ebi = (~x2) & 0b111;    // x=7: 10000000. x2=1: 01111111

    if (si == ei) {
        for (uint8_t mask = 1 << ebi; mask >= 1 << sbi; mask >>= 1)
            screen[si] |= mask;
    } else {
        for (uint8_t mask = 1 << sbi; mask > 0; mask >>= 1)
            screen[si] |= mask;
        for (int i = si + 1; i < ei; ++i)
            screen[i] = 0xff;
        for (uint8_t mask = 1 << 7; mask >= 1 << ebi; mask >>= 1)
            screen[ei] |= mask;
    }
}

暫無
暫無

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

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