我是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++的字符类型是整数类型,因此可以自由转换为整数.
请注意使用括号来强制执行预期的评估顺序.
演示.
您可以使用在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++的字符类型是整数类型,因此可以自由转换为整数.
请注意使用括号来强制执行预期的评估顺序.
演示.