[英]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.