Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Побитовые операции. Помогите понять всю соль.

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

MakssWay



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Чему равно DiskNumber на выходе из процедуры, если  
1) i==1,  
2) i==2;
3) i==3;
 

Код:
unsigned DiskNumber(unsigned i) {
unsigned disk_number = 1;
 
  while (!(i & 1)) {
    i >>= 1;
    disk_number++;
  }
}
 

 
Добавлено
И почему именно так - ?

Всего записей: 286 | Зарегистр. 10-04-2001 | Отправлено: 20:34 27-11-2002
IgGass



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MakssWay
 Операция "i >>= 1" эквивалентна "i=i>>1" , т.е., берется бинарное представление i, делается один сдвиг вправо , т.е., например,  
3  (0000...00011) переходит в (0000...00001).  
Результат присваивается i. Обрати внимание, что в данном случае используются unsigned int, это означает, что все биты int используются для представления величины числа (в обычном   int  первый бит используется для сохранения знака).
Операция & это побитовый and между двумя int. Бинарное представление 1  это 0000...0001. Таким образом 3&1 и 1&1 отличны от нуля (и в первом, и во втором случае результат 0000...0001).
В свою очередь условие !(i & 1) окажется верным лишь для четных i, поскольку, для любых нечетных последний бит будет 1, так что весь результат будет отличен от нуля, и его negation не даст 1.
Поэтому для i=1 и i=3 disk_number будет 1, т.к. мы не разу не зайдем в while, а для i=2 мы зайдем лишь один раз (и увеличим disk_number на 1), поскольку первый же сдвиг вправо переводит 2 в 1.  


----------
"Тот, кто щадит врага, не щадит самого себя."
Фрэнсис Бэкон

Всего записей: 1043 | Зарегистр. 01-03-2002 | Отправлено: 21:26 27-11-2002
MakssWay



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IgGass
Почему этот код выдает числа вовсе не в двоичной системе?

Код:
#include <stdio.h>
#include <string.h>
 
int main(void) {
  int i, M;
  unsigned int j;  
  char s[11]={'0','1','2','3','4','5','6','7','8','9','10'};
 
  M=11;
   
  for (i=0, j=0; i<M; i++, j++) {
    printf("%c --> %d\n", s[i] , j=j >> 1);
  }
 
  exit(0);
}

 
Добавлено
IgGass
Спасибо за исчерпывающее объяснение

Всего записей: 286 | Зарегистр. 10-04-2001 | Отправлено: 00:09 28-11-2002 | Исправлено: MakssWay, 00:27 28-11-2002
IgGass



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MakssWay
%i и %d эквивалентны - они выводят  int в десятичном представлении. %x и %X - выводят int в гексадецимальном представлении (удобно для просмотра адрессов, на которые указывают поинтеры). В том коде, что ты приводишь, ты каждый раз распечатываешь сдвинутое число, но это не совсем то, что тебе нужно.  
после каждого сдвига ты должен отделять последний бит (например, с помощью побитового and с единицей). Например, этот код выведет биты числа х, но в обратном порядке:

Код:
 
int j =x;
printf("%d",  (x&1) ); // выводим первый бит х
while(j) // кол-во итераций равно количеству битов в х
    printf("%d",  ((j>>=1)&1) ); // сдвигаем х на один, и отделяем последний бит
 

 
 


----------
"Тот, кто щадит врага, не щадит самого себя."
Фрэнсис Бэкон

Всего записей: 1043 | Зарегистр. 01-03-2002 | Отправлено: 00:36 28-11-2002
MakssWay



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IgGass
((Xn>>k) & INT_MAX);
число INT_MAX (32767) не имеет аналога в битовом представлении. Как понимать тогда эту запись?

Всего записей: 286 | Зарегистр. 10-04-2001 | Отправлено: 14:25 29-12-2002
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MakssWay
 
Цитата:
число INT_MAX (32767) не имеет аналога в битовом представлении.  
 
Интересно, как оно тогда в памяти хранится?

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 17:17 29-12-2002
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MakssWay

Цитата:
число INT_MAX (32767) не имеет аналога в битовом представлении

32767 == 0111111111111111
Ты можешь написать 32767, 077777, 0x7FFF. Компилятор тебя поймет.
 

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 08:04 30-12-2002
STEEL



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Какие операции называют бинарными и почему? И что это вообще за такие бинарные операции?

Всего записей: 2293 | Зарегистр. 06-01-2002 | Отправлено: 17:33 02-03-2003
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
STEEL
1) Бинатными называются операции имеющие под собой математические вычисления в бинарной системе счисления. Есть десятичная, шестнадцатиричная, двоичная - она же бинарная система счисления.  
2) Система счисления определяет количество значений в одном знакоместе числа.
3) Логические операции AND NOT OR (XOR) являются тоже бинарными, но были известны при Аристотеле и определены им как логические.
4) К бинарным принято относить сдвиги SHL, SHR; ROL, ROR - (с переносом); TEST (наличие бита); и прочие битовые вычисления, коих нынешний процессор имеет тьму.
5) число INT_MAX (32767) не имеет аналога в битовом представлении. - Может быть это условие поставленное преподавателем, дабы затруднить задачу?


----------
Meaning this is something additional.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 08:24 03-03-2003
jetage



Кодокопатель
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
STEEL
Бинарные - операцие, работающие с двоичными (бинарными) операндами, манипулируют на уровне битов.
Добавлено
Пока писал, уже все подробно объяснили

----------
Замки.Ru - каталог замков производства России и стран СНГ

Всего записей: 550 | Зарегистр. 03-03-2002 | Отправлено: 08:29 03-03-2003 | Исправлено: jetage, 08:32 03-03-2003
vlish

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
неа, не правильно
 
имхо, путаете бинарные операции с битовыми.
бинарные - это те которые оперируют двумя операндами, например, сложение, вычитание, умножение...
ещё бывают унарные (например, "++", "--") и тренарные (в си/сипп он такой один уродливый : "?")

Всего записей: 71 | Зарегистр. 30-03-2002 | Отправлено: 03:52 05-03-2003 | Исправлено: vlish, 03:53 05-03-2003
STEEL



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Существует ли какая-нибудь мат. формула. Как простому человеку перевести десятичную дробь в шестнадцатиричную?

Всего записей: 2293 | Зарегистр. 06-01-2002 | Отправлено: 00:26 27-03-2003
IntenT



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
STEEL
Вещественные числа хранятся в "специальном" формате, в представлении
Y = М*10^(x) - где
M - Мантисса числа Y  
х - показатель степени
 
При этом число хранится в двоичном коде, где первые сколько-то бит представляют мантиссу(обычно беззнаковую, или знак всего чисда хранится в самом старшем бите),
а след. биты - показатель степени как знаковое число.
 
Если надо представить просто 10.52 в шестнадцатиричном виде  - то обычно переводят отдельно целую часть и отдельно дробную.

Всего записей: 1584 | Зарегистр. 16-12-2001 | Отправлено: 01:02 27-03-2003
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Побитовые операции. Помогите понять всю соль.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru