2017-01-18 4 views
4

Я новичок в C++. В Python 3 можно преобразовать строку «ABC» в выбранные биты, как это и печать, когда пара битов 11:Получить бит из байта и фрагмента 2 битовых пары

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++; то есть как определить биты 1 и 2 символа «C» равным 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 

ответ

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++ входят в число интегральных типов и поэтому свободно конвертируются в целые числа.

Обратите внимание на использование круглых скобок для принудительного ожидаемого порядка оценки.

Demo.

+0

Спасибо! Вы правы, что я получаю предупреждение: & имеет более низкий приоритет, чем ==; == будет оцениваться сначала [-Wparentheses] 'при выполнении' if ((s [i] >> (2 * j)) & 3 == 3) {'как в вашем исходном ответе вместо' if (((s [i] >> (2 * j)) & 3) == 3) {'как в вашем отредактированном ответе. Это смещает 's [i] >> (2 * j)', а затем '& 3' маски. Я понял. Благодаря! –

1

Для проверки п-й бит установлен или вы не можете использовать что-то вроде ниже

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