C++20中头文件bit的利用

打印 上一主题 下一主题

主题 803|帖子 803|积分 2409

      C++20中头文件bit是数字库(numeric library)的一部分,界说用于访问、操作和处理单个位和位序列(individual bits and sequences of bits)的函数
      1.std::endian:指示标量类型的字节序(byte order),支持little(小端序)、big(大端序)、native:
      如果所有标量类型都是小端序,则std::endian::native即是std::endian::little。如果所有标量类型都是大端序,则std::endian::native即是 std::endian::big。
      如果所有标量类型的sizeof都即是1,则字节序可有可无,而且所有三个值std::endian::little、std::endian::big和std::endian::native都相同。
      如果平台利用混合字节序,则std::endian::native既不即是std::endian::big,也不即是std::endian::little。
      2.std::bit_cast:将一种类型的对象体现重新表明为另一种类型的对象体现
      3.std::has_single_bit:检查一个数字是否是2的整数幂
      4.std::bit_ceil:找到不小于给定值的最小的2的整数幂
      5.std::bit_floor:找到不大于给定值的最大2的整数幂
      6.std::bit_width:找到体现给定值所需的最小位数
      7.std::rotl:计算按位左循环(left-rotation)的效果
      8.std::rotr:计算按位右循环(right-rotation)的效果
      9.std::countl_zero:从最高有效位开始计算连续0 bits的个数
      10.std::countl_one:从最高有效位开始计算连续1 bits的个数
      11.std::countr_zero:从最低有效位开始计算连续0 bits的个数
      12.std::countr_one:从最低有效位开始计算连续1 bits的个数
      13.std::popcount:计算无符号整数中1 bits的个数。
      以下为测试代码:
  1. int test_bit()
  2. {
  3.         // 1.std::endian
  4.     if constexpr (std::endian::native == std::endian::big)
  5.         std::cout << "big-endian\n";
  6.     else if constexpr (std::endian::native == std::endian::little)
  7.         std::cout << "little-endian\n"; // little-endian
  8.     else
  9.         std::cout << "mixed-endian\n";
  10.     // 2.std::bit_cast
  11.     static_assert(sizeof(float) == sizeof(uint32_t));
  12.     constexpr float value{ 123.456f };
  13.     uint32_t v1 = std::bit_cast<uint32_t>(value);
  14.     float v2 = std::bit_cast<float>(v1);
  15.     std::cout << std::hex << "v1: " << v1 << ", v2: " << v2 << std::dec << std::endl; // v1: 42f6e979, v2: 123.456
  16.     // 3.std::has_single_bit
  17.     constexpr auto v3{ 4u }, v4{ 6u };
  18.     std::cout << std::has_single_bit(v3) << "," << std::has_single_bit(v4) << std::endl; // 1,0
  19.     // 4.std::bit_ceil
  20.     using bin = std::bitset<8>;
  21.     std::cout << bin(std::bit_ceil(3u)) << "," << bin(std::bit_ceil(9u)) << std::endl; // 00000100,00010000
  22.     // 5.std::bit_floor
  23.     std::cout << bin(std::bit_floor(3u)) << "," << bin(std::bit_floor(9u)) << std::endl; // 00000010,00001000
  24.     // 6.std::bit_width
  25.     std::cout <<  std::bit_width(0u) << "," << std::bit_width(3u) << std::endl; // 0,2
  26.    
  27.     // 7.std::rotl
  28.     constexpr std::uint8_t i{ 0b00011101 };
  29.     std::cout << bin(std::rotl(i, 1)) << "," << bin(std::rotl(i, 4)) << std::endl; // 00111010,11010001
  30.    
  31.     // 8.std::rotr
  32.     std::cout << bin(std::rotr(i, 1)) << "," << bin(std::rotr(i, 4)) << std::endl; // 10001110,11010001
  33.    
  34.     // 9.std::countl_zero
  35.     constexpr std::uint16_t s{ 0b00100011 };
  36.     std::cout << std::countl_zero(i) << "," << std::countl_zero(s) << std::endl; // 3, 10
  37.     // 10.std::countl_one
  38.     constexpr std::uint32_t l{ 0b11111111101100110000000011111100 };
  39.     std::cout << std::dec << std::countl_one(i) << "," << std::countl_one(l) << std::endl; // 0,9
  40.     // 11.std::countr_zero
  41.     std::cout << std::countr_zero(i) << "," << std::countr_zero(l) << std::endl; // 0,2
  42.     // 12.std::countr_one
  43.     std::cout << std::countr_one(i) << "," << std::countr_one(s) << std::endl; // 1,2
  44.     // 13.std::popcount
  45.     std::cout << std::popcount(s) << "," << std::popcount(l) << std::endl; // 3,19
  46.         return 0;
  47. }
复制代码
      实行效果如下图所示:

      GitHub:https://github.com/fengbingchun/Messy_Test

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表