c++ - 从字节和切片中获取位 2 位对

标签 c++ c++11 bit-manipulation byte bit

我是 C++ 新手。在 Python 3 中,只要一对位为 11,我就可以将字符串 'ABC' 转换为选定的位并打印:

s = 'ABC'
for i, char in enumerate(s):
    for j in range(4):
        if ord(char) >> 2*j & 0b11 == 3:
            print(i, char, ord(char), j, ord(char) >> 2*j & 0b11)

哪个返回:

2 C 67 0 3

我如何在 C++ 中做同样的事情;即我如何识别字符“C”的第 1 位和第 2 位是 11?我目前有这段代码:

//#include <string>
//#include <bitset>
#include <iostream>
//using namespace std;
int main(){
  const int bits_in_byte = 8;
  std::string s = "ABC";
  for (std::size_t i = 0; i < s.size(); ++i)
  {
    for (int j = 0; j < 4; ++j) {
      std::cout << i << ' ' << s[i] << ' ' << std::bitset<bits_in_byte>(s[i]) << std::endl;
    }
  }
}

哪个返回:

0 A 01000001
0 A 01000001
0 A 01000001
0 A 01000001
1 B 01000010
1 B 01000010
1 B 01000010
1 B 01000010
2 C 01000011
2 C 01000011
2 C 01000011
2 C 01000011

最佳答案

您可以使用在 Python 中使用的相同位操作技巧:

for (std::size_t i = 0; i < s.size(); ++i) {
    for (int j = 0; j < 4; ++j) {
        if (((s[i] >> (2*j)) & 3) == 3) {
            std::cout << i << " " << s[i] << " " << (int)s[i] << " " << j << " " << ((s[i] >> 2*j) & 3) << std::endl;
        }
    }
}

您不需要使用 ord,因为 C++ 的字符类型属于整数类型,因此可以自由转换为整数。

请注意使用括号来强制执行预期的评估顺序。

Demo.

关于c++ - 从字节和切片中获取位 2 位对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41728206/

相关文章:

C++整理负输出

c++ - boost 时出现段错误( boost :filesystem:exists)

Java随机序列

c++ - 如何将可变数量的参数传递给 printf/sprintf

c++ - (c++) 节点 header 的语法错误

c++ - 类成员是一个类型未知的派生对象

c++11 - 编译 Cortex M3 裸机

assembly - 清除 1 条 ARM 指令中的高 16 位

java - 如果值不适合则设置字节

python - pybind11 - 识别并删除 C++ 包装器中的内存泄漏