在C++17中,什么是正确表达std::byte常量的方法?

ih99xse1  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(121)

编译器警告不要在按位操作中混合使用int和bytes。我能找到的创建字节常量的最好方法是构造函数语法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;
    }
}
mnowg1ta

mnowg1ta1#

是的,最接近文字字节表达式的是Shawn提到的byte{0},如cppreference std::byte page上的(底部)示例所示。
没有literal suffix,如浮点或无符号。

yr9zkbsy

yr9zkbsy2#

如果不使用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;
    }
}

相关问题