Перевод строки в число.

Тема в разделе "Arduino & Shields", создана пользователем Maks_Tresh, 10 июл 2016.

  1. Maks_Tresh

    Maks_Tresh Нерд

    Как перевести строку, в которой записано число в двоичной системе, в число?
    Код (C++):
    String bytes = "B10101010"; //двоичная система
    int i = int(bytes); //так не работает
    //должно получится: i = B10101010
    P.S. Делаю скетч для сдвигового регистра.
     
  2. Limoney

    Limoney Гик

  3. DIYMan

    DIYMan Guest

    Если строка именно в таком формате, "B10101010" - то навскидку как-то так:

    Код (C++):

    byte convert(const String& num)
    {
     byte result = 0;
    if(!num.length())
      return result;

      const char* strBegin = num.c_str();
      const char* strEnd = strBegin + num.length() - 1;
      byte bitPos = 0;
      while(strEnd != strBegin)
      {
        byte b = *strEnd - '0';
        if(b)
         result |= (1 <<  bitPos);

        strEnd--;
        bitPos++;
      }
    return result;
    }
     
    Это совсем навскидку, при необходимости допилИте, если где апшипся.
     
    Maks_Tresh нравится это.
  4. ostrov

    ostrov Гуру

    Напрямую через порты быстрее раз в 100 или 200.
     
  5. aleksis-76

    aleksis-76 Нерд

    atoi
    а зачем представлять все это строкой?
     
  6. DIYMan

    DIYMan Guest

    atoi не прокатит, уж лучше тогда strtoul.
     
    Maks_Tresh нравится это.
  7. Maks_Tresh

    Maks_Tresh Нерд

    Спасибо!!!
     
  8. aleksis-76

    aleksis-76 Нерд

    ну тогда сдвиг, преобразование и сразу в порт, все как сказал DIYMan
    вот сдесь можно пихать прямо в порт
    if(b){
    portx=1;
    синхронизация;
    }else{
    portx=0;
    синхронизация;
    }
     
    Последнее редактирование: 10 июл 2016
  9. DIYMan

    DIYMan Guest

    Вообще конечно задача странная: сначало кто-то формирует строку, вместо того, чтобы тупо передать байт. Потом мы эту строку переводим обратно в байт. Вопрос: зачем лишние телодвижения?
     
  10. Limoney

    Limoney Гик

    Записывайте сразу байт. Зачем почем зря столько памяти израсходовать?
     
  11. Maks_Tresh

    Maks_Tresh Нерд

    А как можно один из 8 битов изменить на его противоположный, чтобы не делать "лишние телодвижения"?
     
  12. aleksis-76

    aleksis-76 Нерд

    вот код того как это можно сделать

    с ваш байт
     
    Maks_Tresh нравится это.
  13. aleksis-76

    aleksis-76 Нерд

    исключающее или
    b00000001^=b00000001 байт 0 примет значение 0, если применить второй раз то примет значение 1
     
    Maks_Tresh нравится это.
  14. DIYMan

    DIYMan Guest

    Битовыми операциями, вестимо. Неоптимальный говнокод:

    Код (C++):

    void invertBit(byte& num, byte bitPos)
    {
       if(num & (1 << bitPos))
        num &= ~(1 << bitPos);
      else
       num |= (1 << bitPos);
    }
     
    Говнокод пооптимальней:

    Код (C++):

    void invertBit(byte& num, byte bitPos)
    {
       num ^= (1 << bitPos);
    }
     
     
    Maks_Tresh нравится это.
  15. Maks_Tresh

    Maks_Tresh Нерд

    Спасибо всем!
     
  16. aleksis-76

    aleksis-76 Нерд

    подытожим сказанное)
    пока i меньше 8(один байт 8 бит )
    делаем лог и с нашим байтом(двигаем старшим байтом вперед)
    устанавливаем на выходе синхронизации 0
    0x80 это b10000000 двоичных,если старший бит единица то выставляем на информационном выходе 1 иначе 0, выставляем на синхронизирующем выходе 1, данные защелкиваются в сдвиговый регистр, двигаем байт на 1 влево, седьмой бит станет восьмым,затем продолжаем пока i<8(сдвигаем весь байт)