首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字节中获取位和切片2位对

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

Stack Overflow用户
提问于 2017-01-18 19:49:07
回答 2查看 948关注 0票数 4

我是C++的新手。在Python 3中,我可以将字符串'ABC‘转换成这样的选定位,并在一对比特为11时打印:

代码语言:javascript
复制
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)

返回:

代码语言:javascript
复制
2 C 67 0 3

如何在C++中进行相同的操作;例如,如何识别字符'C‘为11的第1位和第2位?我现在有这样的代码:

代码语言:javascript
复制
//#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;
    }
  }
}

返回:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-18 19:54:43

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

代码语言:javascript
复制
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++的字符类型属于整数类型,因此可以自由转换为整数。

注意使用括号强制执行预期的计算顺序。

演示。

票数 6
EN

Stack Overflow用户

发布于 2017-01-18 20:15:59

要检查是否设置了第n位,可以使用如下所示

bit at position x of M = (M & 1<<x) //0 if its zero 1 if its one

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41728206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档