Простое изменение символа до его битового представления

Почему я получаю ошибку? Это выглядит довольно просто для меня. Кроме того, это лучший способ сделать то, что я пытаюсь сделать?

#include <iostream> 
#include <string>


int main() { 

char j = "J"; 
std::cout << bitchar(j);
return 0; 
} 


std::string bitchar(char c) { 
  std::string s;
  unsigned thisdivisor = (unsigned)c;
  while (!thisdivisor) { 
      s += thisdivisor % 2 ? '0' : '1';
      thisdivisor /= 2;
  }
  return s; 
} 

5 ответов

#include <iostream> 
#include <string>
#include <bitset>

int main() {   
    char j = 'J'; 
    std::cout << std::bitset<8>(j);
    return 0;  
} 

Замечания:

  1. "J" является односимвольной строкой в ​​стиле C (с завершающим \0), вы должны использовать 'J' за char,
  2. использование std::bitset распечатать битовый шаблон.

Пытаться char j = 'j' вместо ="j" назначить символ вашей переменной. "j" - это массив строк.

Вы забыли описать ошибку. Предположительно это что-то вроде

‘bitchar’ was not declared in this scope

потому что вы не объявили функцию до того, как вызвали ее в main, Либо перенести определение bitchar до mainили добавить объявление до или внутри main:

std::string bitchar(char c);

Тогда вы, вероятно, получите что-то вроде:

invalid conversion from ‘const char*’ to ‘char’

потому что вы пытаетесь назначить строковый литерал "J" в символьную переменную. Используйте буквенный символ 'J' (с одинарными кавычками).

Тогда вы обнаружите, что вы не получаете никакого вывода. Это потому что while (!thisdivisor) циклы до тех пор, пока значение равно нулю; поэтому он не будет зацикливаться вообще, если вы дадите ему ненулевое значение. Ты хочешь while (thisdivisor) (или же while (thisdiviser != 0) если вы хотите быть более явным), цикл пока он не равен нулю.

Тогда вы обнаружите, что биты инвертированы; вам нужно "0", если результат по модулю равен нулю, тогда как ваш тест выдает "0", если он не равен нулю:

s += thisdivisor % 2 ? '1' : '0';

или же

s += (thisdivisor % 2 == 0) ? '0' : '1';

Наконец, вы можете изменить строку (или построить ее, добавив, а не добавляя), чтобы получить более обычный порядок старших значащих битов.

Ответ 1: почему я получаю эти ошибки

Пытаться char j = 'J'как сказал @losifM. Двойная кавычка определяет массив символов, и вы ищете один символ (одинарную кавычку).

Ответ 2: что лучше

Лучший способ сделать это - использовать std::bitset, затем передайте его с помощью cout,

//Add this
#include <bitset>

char j = 'j';
std::bitset<8> x(j);
std::cout << x;

Это должно быть самоочевидно в этот момент, но это может помочь: Как напечатать (используя cout) способ хранения числа в памяти?

Примечание:

  s += thisdivisor % 2 ? '0' : '1';

также должен быть

  s += thisdivisor % 2 ? '1' : '0';

потому что, если thisdivisor % 2 возвращается 1 (true), вы хотите это добавить 1 с и наоборот.

Вы присваиваете массив char (который распадается на указатель) на char (J). И затем вы инициализируете std::string с помощью char (должно быть c-string).

Другие вопросы по тегам