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

  • Автор темы Titanic
  • Дата начала
T

Titanic

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

Код:
 unsigned char bittest;

bittest | ( 1 << 6 );

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

Titanic

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

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

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

Kmet

Java Team
25.05.2006
1 036
8
#7
не придерайся к словам, "женскую логику" оставь для базара.
заявлять что на всех существующих или будующих платформах байт равен строго 8 битам глупо.
 
W

wtom

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

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

Kmet

Java Team
25.05.2006
1 036
8
#9
ты ответил на вопрос, который был задан не тебе
ты начал офтопить

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

ты в двух строках сделал 2 орфографические ошибки
http://bash.org.ru/quote/191152

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

Между тем я действительно хочу узнать, где это у автора машина с байтом не в 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)
.
 
W
#10
Дело в том, что ты ответить все-равно вряд ли сможешь, т.к. спрашивал я не у тебя. Неужели не понятно?
Да и этот парень, так же, как и тот, кто составляет такие задачи (если это учебная задача), вряд ли в ближайшем будущем должен запариваться на счет длины байта, отличной от 8 бит. Но, даже, если предположить, что у него где-то байт может быть длиннее, это не должно сказаться на алгоритме. Так что упоминание длины байта там вообще ИМХО нафиг не сдалось.

Удачи.

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

Kmet

Java Team
25.05.2006
1 036
8
#11
Дело в том, что ты ответить все-равно вряд ли сможешь, т.к. спрашивал я не у тебя. Неужели не понятно?
Мне глубоко фиолетово, ответил я тебе или нет. Цели такой не ставилось. Неужели не понятно?
Да и этот парень, так же, как и тот, кто составляет такие задачи (если это учебная задача), вряд ли в ближайшем будущем должен запариваться на счет длины байта, отличной от 8 бит. Но, даже, если предположить, что у него где-то байт может быть длиннее, это не должно сказаться на алгоритме. Так что упоминание длины байта там вообще ИМХО нафиг не сдалось.
Должен. Привычка быть внимательным к мелочам и дисциплинированным в програмимровании вообще и особенно на С\С++ сохранит ему не одну сотню часов в будущем.
З.Ы. Поменьше читай борг, там слишком много тупости и детей. А, как говорится, с кем поведешься... И так сильно заметен его отпечаток на твоем стиле общения.
Стиль общения у меня отличный, по крайней мере я не опускаюсь до трюков "а у нее рожа вся в пятнах", в отличии от вас.
З.З.Ы. Писать с ошибками - обыкновенное неуважение к тем, кто это будет читать.
Я полагаю, такому борцу за орфографическую выверенность и литературную чистоту сообщений на форумах, не к лицу использовать такие жаргонные идиомы (З.Ы.). Это знаете ли тоже не уважение. Надо быть последовательным.
 
T

Titanic

#12
Ну вообще я конечно не правильно выразился. вот пример:
Код:
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
???


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

Titanic

#14
Возник небольшой вопросик.
Код:
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, или я не прав?
 
W
#15
Ну вообще я конечно не правильно выразился. вот пример:
Код:
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 в начале. При объявлении переменных их всегда всегда надо инициализировать. Лучше думай об этом, а о размере байта будешь заморачиваться потом =)
Можно, например, так сделать.

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

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

Возник небольшой вопросик.
Код:
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, или я не прав?
угу. читаешь ты их справа налево, а ты пишешь слева направо.