C++17中std::byte的使用

本文介绍了C++17中std::byte的特性,包括其本质、与unsignedchar的区别,以及std::byte支持的整型转换、位操作和初始化规则。展示了如何使用std::byte进行位运算和类型转换,并提供了测试代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      C++17中std::byte的定义如下:std::byte本质上代表一个字节的值

enum class byte : unsigned char {};

      与unsigned char一样,std::byte可以用来访问其它对象(对象表示)占用的原始内存(raw memory),但与unsigned char不同的是,它不是字符类型,也不是算术类型。std::byte模型只是位的集合,仅支持按位和比较操作

      函数std::is_integral_v<T>定义如下:判断T是不是整型,如T为整型,则返回true;如果T的类型为bool、char、char16_t、char32_t、wchar_t、short、int、long、long long,以及任何实现定义的扩展整数类型(any implementation-defined extended integer types),包括任何有符号、无符号、和cv限定的变体(cv-qualified variants),则返回true

template< class T >
inline constexpr bool is_integral_v = is_integral<T>::value;

      std::byte相关函数
      (1).std::to_integer<T>(std::byte):将std::byte对象转换为整型T,仅当is_integral_v<T>为true时有效;
      (2).左移:<<=, 等价于: b = (std::byte)b << (T)shift; 仅当is_integral_v<T(shift)>为true时有效;
      (3).左移:<<,等价于: std::byte(static_cast<unsigned int>(b) << (T)shift); 仅当is_integral_v<T(shift)>为true时有效;
      (4).右移:>>=, 等价于: b = (std::byte)b >> (T)shift; 仅当is_integral_v<T(shift)>为true时有效;
      (5).右移: >>, 等价于:std::byte(static_cast<unsigned int>(b) >> (T)shift); 仅当is_integral_v<T(shift)>为true时有效;
      (6).按位&=、|=、^=:等价于:l = l & r; l = l | r; l = l ^ r;
      (7).按位&、|、^、~:等价于:std::byte(static_cast<unsigned int>(l) | static_cast<unsigned int>(r));等

      注意
      (1).列表初始化(使用花括号初始化)是唯一可以直接初始化std::byte对象的方法
      (2).std::byte对象存储在栈上。
      (3).sizeof(std::byte)的大小总是1.
      (4).大多数时候std::byte位数是8,但在有些平台上可能不是。
      (5).用std::to_integer<>(std::byte)可以把std::byte转换为任意基本整数类型(bool、字符类型或者整数类型)。
      (6).std::byte没有定义输入和输出运算符,因此不得不把它转换为整数类型再进行I/O。

      以下为测试代码:

namespace {

std::ostream& operator<<(std::ostream& os, std::byte b)
{
	return os << std::bitset<8>(std::to_integer<int>(b));
}

} // namespace

int test_byte()
{
	// 注意:列表初始化(使用花括号初始化)是唯一可以直接初始化std::byte对象的方法
	std::byte b{ 66 };
	std::cout << b << "\n"; // 01000010

	std::byte b2 = b << 1;
	std::cout << b2 << "\n"; // 10000100
	b <<= 1;
	std::cout << b << "\n"; // 10000100

	std::byte b3 = b >> 1;
	std::cout << b3 << "\n"; // 01000010
	b >>= 1;
	std::cout << b << "\n"; // 01000010

	std::byte b4 = b | std::byte{ 0b11110000 };
	std::cout << b4 << "\n"; // 11110010
	b |= std::byte{ 0b11110000 };
	std::cout << b << "\n"; // 11110010

	b4 = b & std::byte{ 0b11110000 };
	std::cout << b4 << "\n"; // 11110000
	b &= std::byte{ 0b11110000 };
	std::cout << b << "\n"; // 11110000

	b4 = b ^ std::byte{ 0b11111111 };
	std::cout << b4 << "\n"; // 00001111
	b ^= std::byte{ 0b11111111 };
	std::cout << b << "\n"; // 00001111

	b4 = ~b;
	std::cout << b4 << "\n"; // 11110000

	std::byte b5;
	//std::cout << b5 << "\n"; // error: 如果没有初始化,std::byte对象的值是未定义的,因为它存储在栈上

	std::byte b6{};
	std::cout << b6 << "\n"; // 00000000

	std::cout << "sizeof std::byte: " << sizeof(std::byte) << "\n"; // sizeof std::byte: 1

	std::byte b7{ 0xFF };
	std::cout << std::to_integer<unsigned int>(b7) << ","
		<< std::to_integer<int>(b7) << ","
		<< static_cast<int>(std::to_integer<signed char>(b7)) << "\n"; // 255,255,-1

	return 0;
}

      执行结果如下图所示:

      GitHubhttps://github.com/fengbingchun/Messy_Test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值