да такую хрень за сто лет не выучишь
Вопрос о побитовых логических операциях: теория
Да, но как то надо изучать программирование..
Кениган и Ричи все-таки не хрень, однако. Я и сам сомневаюсь что операции с битами мне пригодятся, но учиться то надо.
Даже если сразу не все понятно.
Это K&R (Kernighan and Ritchie) синтаксис описания функций в C, если эти имена что-то вам говорят
oO никогда такого раньше не видел... думал, что уже все детали Си знаю, а вот что бывает ещё...
просмотрел сейчас K&R, они сами называют это старым синтаксисом, (а прототипы в то время писались так "int getbits();")
и во что пишут:
. Новый синтаксис для прототипов функций облегчает компилятору обнаружение ошибок в количестве аргументов и их типах. Старый синтаксис объявления и определения функции все еще допускается стандартом ANSI, по крайней мере на переходный период, но если ваш компилятор поддерживает новый синтаксис, мы настоятельно рекомендуем пользоваться только им.
У меня новый компилятор но как известно gcc полностью соответствует стандарту ANSI поэтому в этом плане не должно быть проблем.
Другое дело если я буду использовать библиотеки которые в этот стандарт не входят.
^ дополнение (унарная операция)
опечатка. должно быть ~
getbits(x,p,n) /* get n bits from position p */
unsigned x, p, n;
устаревший стиль. запрещено применять в этом веке.
int getbits(unsigned x, unsigned p, unsigned n)
{
return 0;
}
это правильная запись.
думал, что уже все детали Си знаю, а вот что бывает ещё
забудьте как страшный сон ;)
но как известно gcc полностью соответствует стандарту ANSI поэтому в этом плане не должно быть проблем.
tt.c:1:1: предупреждение: по умолчанию возвращаемый тип функции - ‘int’
tt.c: В функции ‘getbits’:
tt.c:4:1: предупреждение: control reaches end of non-void function
а старый стиль пожрал...
hardorsoft,
а подумать?
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
return ((x << (p+1-n)) & ~(~0 >> n));
}
Прошу не бить сильно я только учусь, как правильно работать с битами.
попробуйте для начала не вставлять в одно выражение столько непонятных операций. напишите так:
t1 = p+1-n;
t2 = x << t1;
t3 = ~0 >> n;
t4 = ~t3;
t5 = t2 & t4;
/* вывод всех t */Не знаю у возможно у вас установлен g++ у меня только gcc, и он ошибки не выдает.
Хорошо я подумаю, и попробую ваш вариант.
а можно ссылку на ваши лекции?
забудьте как страшный сон
а старый стиль пожрал...
unsigned getbits(x,p,n) /* get n bits from position p */
unsigned x, p, n;
{
return ((x >> (p+1-n)) & ~(~0 << n));
}
вот это компилируется gcc с любыми флагами даже без предупреждений
а можно ссылку на ваши лекции?
лучше K&R скачайте... или Подбельского и Фомина (там есть не всё, но сам по ним учил)
Вот вариант правдоподобный.
если 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));
}
mogul82, intuit.ru там курсы по программированию СИ
http://www.intuit.ru/department/pl/cpl/class/free/0/
Можно даже корочки получить.
Желаю удачи.
Это верно?
да, возьмите уже карандаш и проверьте...
23 = 0001 0111 (2)
<<2= 0101 1100
& 0000 0111
= 0000 0100
mogul82, intuit.ru там курсы по программированию СИ
http://www.intuit.ru/department/pl/cpl/class/free/0/
интуит - отвратительная вещь. сам правда пытался пользоваться, когда прологом интересовался. но лучше взять любую книжку, тем более по си - литературы навалом.
Я правильно решил задачу?
Fat-Zer, а что делать тем у кого нет денег на высшее образование? У меня их нет, а корочки какие никакие будут.
Может есть другие бесплатные курсы?
В любом случае я intuit.ru выражаю благодарность, так же как и вам. :-)
mogul82, если надо с литературой помочь то у меня есть список не плохой. В инете много книг, но не все для начинающих.
Я правильно решил задачу?
я же вроде написал, что правильно.
Fat-Zer, а что делать тем у кого нет денег на высшее образование? У меня их нет, а корочки какие никакие будут.
Может есть другие бесплатные курсы?
В любом случае я intuit.ru выражаю благодарность.
я про качество информации, которая там есть. сам на эти курсы не записывался.
ЗЫ: а я то, глупый, до сих пор считаю, что у нас высшее образование бесплатное... другое дело нет времени/желания/возможности...
Да пробовал я на заочке учиться толку мало не все преподаватели ответственно ведут занятия и с пенсией в четыре тысячи даже ездить в город накладно.
Хотел на пхп написать им сайт, дак меня даже к декану факультета секретари не пустили - сидят в дум играют.
Во многих вузах есть для заочников дистанционное образование, но там платно.
Хотел бы я например в Новосибирсоком вузе дистанционно обучаться, там можно даже на сессии не ездить, только диплом надо защищать очно.