当前位置:  开发笔记 > 编程语言 > 正文

从字节和切片2位对获取位

如何解决《从字节和切片2位对获取位》经验,为你挑选了1个好方法。

我是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 
//#include 
#include 
//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(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

dasblinkenli.. 6

您可以使用在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++的字符类型是整数类型,因此可以自由转换为整数.

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

演示.



1> dasblinkenli..:

您可以使用在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++的字符类型是整数类型,因此可以自由转换为整数.

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

演示.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有