LinuxForum.Fans
Тема

Вопрос о побитовых логических операциях: теория

Автор: hardorsoft 73 сообщений 11052 просмотров
#146026

да такую хрень за сто лет не выучишь

#146030

Да, но как то надо изучать программирование..
Кениган и Ричи все-таки не хрень, однако. Я и сам сомневаюсь что операции с битами мне пригодятся, но учиться то надо.
Даже если сразу не все понятно.

#146042
bormant написал:
Это K&R (Kernighan and Ritchie) синтаксис описания функций в C, если эти имена что-то вам говорят

oO никогда такого раньше не видел... думал, что уже все детали Си знаю, а вот что бывает ещё...
просмотрел сейчас K&R, они сами называют это старым синтаксисом, (а прототипы в то время писались так "int getbits();")
и во что пишут:

. Новый синтаксис для прототипов функций облегчает компилятору обнаружение ошибок в количестве аргументов и их типах. Старый синтаксис объявления и определения функции все еще допускается стандартом ANSI, по крайней мере на переходный период, но если ваш компилятор поддерживает новый синтаксис, мы настоятельно рекомендуем пользоваться только им.
#146050

У меня новый компилятор но как известно gcc полностью соответствует стандарту ANSI поэтому в этом плане не должно быть проблем.
Другое дело если я буду использовать библиотеки которые в этот стандарт не входят.

#146054
hardorsoft написал:
^ дополнение (унарная операция)

опечатка. должно быть ~

hardorsoft написал:
getbits(x,p,n) /* get n bits from position p */
unsigned x, p, n;

устаревший стиль. запрещено применять в этом веке.

text
int getbits(unsigned x, unsigned p, unsigned n)
{
    return 0;
}

это правильная запись.

Fat-Zer написал:
думал, что уже все детали Си знаю, а вот что бывает ещё

забудьте как страшный сон ;)

#146056
hardorsoft написал:
но как известно gcc полностью соответствует стандарту ANSI поэтому в этом плане не должно быть проблем.
gcc написал:
tt.c:1:1: предупреждение: по умолчанию возвращаемый тип функции - ‘int’
tt.c: В функции ‘getbits’:
tt.c:4:1: предупреждение: control reaches end of non-void function

а старый стиль пожрал...

#146060

hardorsoft,
а подумать?

text

                     1          2          3
поз:      01234567 89012345 67890123 45678901

x: abcdefgh 00000000 00000000 00000000 p=2,n=2: ^^ x<<p: cdefgh00 00000000 00000000 00000000 ~(~0>>n): 11000000 00000000 00000000 00000000 (x<<p) & ~(~0>>n): cd000000 00000000 00000000 00000000

Результат будет в младших разрядах с точки зрения новой нумерации бит слева направо.
Выводить нагляднее как printf("%X\n", ...) или printf("%08X\n", ...).

ps. А ещё нагляднее: http://linuxforum.ru/viewtopic.php?pid=162764#p162764

#146061
hardorsoft написал:
return ((x << (p+1-n)) & ~(~0 >> n));

}

Прошу не бить сильно я только учусь, как правильно работать с битами.

попробуйте для начала не вставлять в одно выражение столько непонятных операций. напишите так:

text
t1 = p+1-n;
t2 = x << t1;
t3 = ~0 >> n;
t4 = ~t3;
t5 = t2 & t4;
/* вывод всех t */
#146063

Не знаю у возможно у вас установлен g++ у меня только gcc, и он ошибки не выдает.
Хорошо я подумаю, и попробую ваш вариант.

#146066

а можно ссылку на ваши лекции?

#146067
drBatty написал:
забудьте как страшный сон
drBatty написал:
а старый стиль пожрал...
text

unsigned getbits(x,p,n)  /* get n bits from position p */
unsigned x, p, n;
{
    return ((x >> (p+1-n)) & ~(~0 << n));
}

вот это компилируется gcc с любыми флагами даже без предупреждений

#146068
mogul82 написал:
а можно ссылку на ваши лекции?

лучше K&R скачайте... или Подбельского и Фомина (там есть не всё, но сам по ним учил)

#146072

Вот вариант правдоподобный.
если x = 23, p = 4, n = 3, то
результат t5 = (dec)4.
Это верно?


getbits(x,p,n) /* get n bits from position p */
unsigned x, p, n;
{

return ((x << (p+1-n)) & ~(~0 << n));

}
#146080
hardorsoft написал:
Это верно?

да, возьмите уже карандаш и проверьте...

text
  
23 = 0001 0111 (2)
<<2= 0101 1100
&    0000 0111
=    0000 0100
hardorsoft написал:
mogul82, intuit.ru там курсы по программированию СИ
http://www.intuit.ru/department/pl/cpl/class/free/0/

интуит - отвратительная вещь. сам правда пытался пользоваться, когда прологом интересовался. но лучше взять любую книжку, тем более по си - литературы навалом.

#146086

Я правильно решил задачу?

#146090

Fat-Zer, а что делать тем у кого нет денег на высшее образование? У меня их нет, а корочки какие никакие будут.
Может есть другие бесплатные курсы?
В любом случае я intuit.ru выражаю благодарность, так же как и вам. :-)

#146092

mogul82, если надо с литературой помочь то у меня есть список не плохой. В инете много книг, но не все для начинающих.

#146104
hardorsoft написал:
Я правильно решил задачу?

я же вроде написал, что правильно.

hardorsoft написал:
Fat-Zer, а что делать тем у кого нет денег на высшее образование? У меня их нет, а корочки какие никакие будут.
Может есть другие бесплатные курсы?
В любом случае я intuit.ru выражаю благодарность.

я про качество информации, которая там есть. сам на эти курсы не записывался.
ЗЫ: а я то, глупый, до сих пор считаю, что у нас высшее образование бесплатное... другое дело нет времени/желания/возможности...

#146109

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

Войдите или зарегистрируйтесь, чтобы ответить.