我是C ++的新手。在Python 3中,我可以将字符串'ABC'转换为这样的选定位并打印,只要一对位是11:
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
答案 0 :(得分: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 :(得分:1)
要检查第n位是否已设置,您可以使用下面的内容
bit at position x of M = (M & 1<<x) //0 if its zero 1 if its one