Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Побитовые операции
Форум программистов > Системное программирование > C, С++ и С Builder > Общие вопросы по С и С++
Titanic
Как просканировать байт на факт того что какой-либо бит( или несколько бит) установлен(ы) в единицу, чтоб стало извесно какой именно бит(ы), при условии что байт содержит 8 бит, так-же байт может содержать более восьми бит - тогда как сканернуть только первые восемь? Thanks.

 unsigned char bittest;

bittest | ( 1 << 6 );

for( i=0; i<8; i++ )
  {
  printf( "%d ", (bittest & (1 << i)) ? 1 : 0 );
  }

Что неправильно в этом коде? Я хочу установить шестой бит в единицу, а затем вывести значения восьми...
Kmet
bittest |= ( 1 << 6 );
Titanic
Спасибо.
Вот еще вопрос:
Допустим что в bittest биты с пятого по седьмой установлены в единицу, мне надо их считать и в результате я должен иметь некие данные число n где n размер массива, даже не сам размер а степень в которую нужно возвести число два чтоб получить реальный размер.
Я начал так.

BYTE bittest, ry;
bittest << 5;
ry |= ( 1 << 0 );
bittest << 7;

// дальше не знаю как.

Т.е надо наверно запихать в ry биты с пятого по седьмой от bittest и чтоб они стали с нулевого по треттий в ry? Совс ем не имею опыта с побитовыми операциями. Не подскажете как сзделать?
wtom
Цитата(Titanic @ 27:07:2008, 15:23 ) *
так-же байт может содержать более восьми бит


Где это у тебя байт может содержать больше 8 бит?
Kmet
wtom
а почему не может?
wtom
Цитата(Kmet @ 28:07:2008, 17:41 ) *
wtom
а почему не может?

Я не спрашивал "почему?", я спросил "где?"
Kmet
не придерайся к словам, "женскую логику" оставь для базара.
заявлять что на всех существующих или будующих платформах байт равен строго 8 битам глупо.
wtom
ты ответил на вопрос, который был задан не тебе
ты ответил на вопрос вопросом
ты ответил на вопрос, который я не задавал
ты в двух строках сделал 2 орфографические ошибки
ты нахамил

Между тем я действительно хочу узнать, где это у автора машина с байтом не в 8 бит. Не машинное слово, а именно байт. Мне интересно.
Kmet
Цитата(wtom @ 29:07:2008 - 09:35) *
ты ответил на вопрос, который был задан не тебе

ты начал офтопить

Цитата(wtom @ 29:07:2008 - 09:35) *
ты ответил на вопрос вопросом

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

Цитата(wtom @ 29:07:2008 - 09:35) *
ты в двух строках сделал 2 орфографические ошибки

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

Цитата(wtom @ 29:07:2008 - 09:35) *
ты нахамил

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

Цитата(wtom @ 29:07:2008 - 09:35) *
Между тем я действительно хочу узнать, где это у автора машина с байтом не в 8 бит. Не машинное слово, а именно байт. Мне интересно.

на мэйнфреймах это не такое уж и редкое явление. полагаю для встраиваемых систем тоже.
если бы ты был внимательнее, и посмотрел на раздел в котором находится тема, то понял, что байт здесь расматривается в контексте языка С. Где байт это
Цитата
addressable unit of data storage large enough to hold any member of the basic character set of the execution environment" (clause 3.6 of the C standard)
.
wtom
Дело в том, что ты ответить все-равно вряд ли сможешь, т.к. спрашивал я не у тебя. Неужели не понятно?
Да и этот парень, так же, как и тот, кто составляет такие задачи (если это учебная задача), вряд ли в ближайшем будущем должен запариваться на счет длины байта, отличной от 8 бит. Но, даже, если предположить, что у него где-то байт может быть длиннее, это не должно сказаться на алгоритме. Так что упоминание длины байта там вообще ИМХО нафиг не сдалось.

Удачи.

З.Ы. Поменьше читай борг, там слишком много тупости и детей. А, как говорится, с кем поведешься... И так сильно заметен его отпечаток на твоем стиле общения.
З.З.Ы. Писать с ошибками - обыкновенное неуважение к тем, кто это будет читать.
Kmet
Цитата(wtom @ 29:07:2008 - 11:25) *
Дело в том, что ты ответить все-равно вряд ли сможешь, т.к. спрашивал я не у тебя. Неужели не понятно?

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

Должен. Привычка быть внимательным к мелочам и дисциплинированным в програмимровании вообще и особенно на С\С++ сохранит ему не одну сотню часов в будущем.
Цитата(wtom @ 29:07:2008 - 11:25) *
З.Ы. Поменьше читай борг, там слишком много тупости и детей. А, как говорится, с кем поведешься... И так сильно заметен его отпечаток на твоем стиле общения.

Стиль общения у меня отличный, по крайней мере я не опускаюсь до трюков "а у нее рожа вся в пятнах", в отличии от вас.
Цитата(wtom @ 29:07:2008 - 11:25) *
З.З.Ы. Писать с ошибками - обыкновенное неуважение к тем, кто это будет читать.

Я полагаю, такому борцу за орфографическую выверенность и литературную чистоту сообщений на форумах, не к лицу использовать такие жаргонные идиомы (З.Ы.). Это знаете ли тоже не уважение. Надо быть последовательным.
Titanic
Ну вообще я конечно не правильно выразился. вот пример:
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
???


Но это не то, я действительно на момент когда задавал вопрос думал что байт имеет разное количество бит в зависимости от платформы, операционной системы и т.п. Вообще и сейчас не совсем уверен что это не так, ведь это возможно, просто не реализовано почему-то.. А от куда взялось мнение о том что байт везде разный не помню, читал где-то вроде, на форумах попадалось( различные гуру говорили о совместимости переносимости и что-то такое еще серьезное).. Ну вобщем понятно(или непонятно). Спсб.
European
Про переменную длину байта есть здесь: ]]>http://en.wikipedia.org/wiki/Byte]]>

P.S. Господа, не надо флудить
Titanic
Возник небольшой вопросик.
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, или я не прав?
wtom
Цитата(Titanic @ 29:07:2008, 13:41 ) *
Ну вообще я конечно не правильно выразился. вот пример:
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
???


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

CODE
unsigned short bittest = 1 << 6;

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


Цитата(Titanic @ 29:07:2008, 14:49 ) *
Возник небольшой вопросик.
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, или я не прав?


угу. читаешь ты их справа налево, а ты пишешь слева направо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.