Побитовые операции

Тема в разделе "Общие вопросы по С и С++", создана пользователем Titanic, 27 июл 2008.

Наш партнер Genesis Hackspace
  1. Titanic

    Titanic Гость

    Как просканировать байт на факт того что какой-либо бит( или несколько бит) установлен(ы) в единицу, чтоб стало извесно какой именно бит(ы), при условии что байт содержит 8 бит, так-же байт может содержать более восьми бит - тогда как сканернуть только первые восемь? Thanks.

    Код (Text):
     unsigned char bittest;

    bittest | ( 1 << 6 );

    for( i=0; i<8; i++ )
    {
    printf( "%d ", (bittest & (1 << i)) ? 1 : 0 );
    }
    Что неправильно в этом коде? Я хочу установить шестой бит в единицу, а затем вывести значения восьми...
     
  2. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.032
    Симпатии:
    6
    bittest |= ( 1 << 6 );
     
  3. Titanic

    Titanic Гость

    Спасибо.
    Вот еще вопрос:
    Допустим что в bittest биты с пятого по седьмой установлены в единицу, мне надо их считать и в результате я должен иметь некие данные число n где n размер массива, даже не сам размер а степень в которую нужно возвести число два чтоб получить реальный размер.
    Я начал так.

    Код (Text):
    BYTE bittest, ry;
    bittest << 5;
    ry |= ( 1 << 0 );
    bittest << 7;

    // дальше не знаю как.
    Т.е надо наверно запихать в ry биты с пятого по седьмой от bittest и чтоб они стали с нулевого по треттий в ry? Совс ем не имею опыта с побитовыми операциями. Не подскажете как сзделать?
     
  4. wtom

    wtom Гость

    Где это у тебя байт может содержать больше 8 бит?
     
  5. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.032
    Симпатии:
    6
    wtom
    а почему не может?
     
  6. wtom

    wtom Гость

    Я не спрашивал "почему?", я спросил "где?"
     
  7. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.032
    Симпатии:
    6
    не придерайся к словам, "женскую логику" оставь для базара.
    заявлять что на всех существующих или будующих платформах байт равен строго 8 битам глупо.
     
  8. wtom

    wtom Гость

    ты ответил на вопрос, который был задан не тебе
    ты ответил на вопрос вопросом
    ты ответил на вопрос, который я не задавал
    ты в двух строках сделал 2 орфографические ошибки
    ты нахамил

    Между тем я действительно хочу узнать, где это у автора машина с байтом не в 8 бит. Не машинное слово, а именно байт. Мне интересно.
     
  9. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.032
    Симпатии:
    6
    ты начал офтопить

    предельно доступно дал понять, что в байте не из 8 битов нет ничего особенного

    http://bash.org.ru/quote/191152

    хамить начал ты.

    на мэйнфреймах это не такое уж и редкое явление. полагаю для встраиваемых систем тоже.
    если бы ты был внимательнее, и посмотрел на раздел в котором находится тема, то понял, что байт здесь расматривается в контексте языка С. Где байт это
    .
     
  10. wtom

    wtom Гость

    Дело в том, что ты ответить все-равно вряд ли сможешь, т.к. спрашивал я не у тебя. Неужели не понятно?
    Да и этот парень, так же, как и тот, кто составляет такие задачи (если это учебная задача), вряд ли в ближайшем будущем должен запариваться на счет длины байта, отличной от 8 бит. Но, даже, если предположить, что у него где-то байт может быть длиннее, это не должно сказаться на алгоритме. Так что упоминание длины байта там вообще ИМХО нафиг не сдалось.

    Удачи.

    З.Ы. Поменьше читай борг, там слишком много тупости и детей. А, как говорится, с кем поведешься... И так сильно заметен его отпечаток на твоем стиле общения.
    З.З.Ы. Писать с ошибками - обыкновенное неуважение к тем, кто это будет читать.
     
  11. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.032
    Симпатии:
    6
    Мне глубоко фиолетово, ответил я тебе или нет. Цели такой не ставилось. Неужели не понятно?
    Должен. Привычка быть внимательным к мелочам и дисциплинированным в програмимровании вообще и особенно на С\С++ сохранит ему не одну сотню часов в будущем.
    Стиль общения у меня отличный, по крайней мере я не опускаюсь до трюков "а у нее рожа вся в пятнах", в отличии от вас.
    Я полагаю, такому борцу за орфографическую выверенность и литературную чистоту сообщений на форумах, не к лицу использовать такие жаргонные идиомы (З.Ы.). Это знаете ли тоже не уважение. Надо быть последовательным.
     
  12. Titanic

    Titanic Гость

    Ну вообще я конечно не правильно выразился. вот пример:
    Код (Text):
    unsigned short bittest; // Переменная одна, не массив.

    bittest |= ( 1 << 6 );

    for( i=0; i<sizeof(short)*8; i++ )
    {
    printf( "%d ", (bittest & (1 << i)) ? 1 : 0 );
    }
    т.е теперь будет выведено в два раза больше бит насколько я понимааю.
    Кстати вывод на экран такой: 0 0 1 0 1 1 1 0 0 0 0 0 1 1 0 1
    ???


    Но это не то, я действительно на момент когда задавал вопрос думал что байт имеет разное количество бит в зависимости от платформы, операционной системы и т.п. Вообще и сейчас не совсем уверен что это не так, ведь это возможно, просто не реализовано почему-то.. А от куда взялось мнение о том что байт везде разный не помню, читал где-то вроде, на форумах попадалось( различные гуру говорили о совместимости переносимости и что-то такое еще серьезное).. Ну вобщем понятно(или непонятно). Спсб.
     
  13. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    1
  14. Titanic

    Titanic Гость

    Возник небольшой вопросик.
    Код (Text):
    BYTE bittest_1;
    bittest_1 |= ( 1 << 6 );

    for( i=0; i<sizeof(unsigned char)*8; i++ )
    {
    printf( "%d ", (bittest_1 & (1 << i)) ? 1 : 0 );
    }
    Этот алгоритм чем-то не правильный. насколько я понимаю операция << это здвиг влево, биты в байте считаются справа на лево, тогда почему результат вывода 0 0 0 0 0 0 1 0, ведь должен 0 1 0 0 0 0 0 0, или я не прав?
     
  15. wtom

    wtom Гость

    Это потому, что ты не инициализировал bittest в начале. При объявлении переменных их всегда всегда надо инициализировать. Лучше думай об этом, а о размере байта будешь заморачиваться потом =)
    Можно, например, так сделать.

    [codebox]unsigned short bittest = 1 << 6;

    for (int i = sizeof(short) * 8 - 1; i >= 0; --i) // <- тоже направление пофиксил =)
    {
    printf((bittest & (1 << i)) ? "1" : "0");
    }[/codebox]

    угу. читаешь ты их справа налево, а ты пишешь слева направо.
     
Загрузка...

Поделиться этой страницей