Титла: побитови полета Публикувано от: dwni2 в Mar 02, 2011, 21:44 Имам няколко въпроса относмо употребата на побитови полета в C. Каква информация може да се съдържа в едно побитово поле? Какъв обем информация може да се съдържа и как зависи обема от брия на битовете на полето? :)
Титла: Re: побитови полета Публикувано от: VladSun в Mar 02, 2011, 22:29 2n
n - брой битове Титла: Re: побитови полета Публикувано от: shoshon в Mar 02, 2011, 23:10 Това е доста интересен въпрос. Не съм чел, но ми е много интересно какво ще отговорят другите?
Значи побитово поле можем да наричаме пространството в което действат побитови оператори, нали така ? Ако дефинираме побитово поле като 2^n трябва да натоварим дпълнително операторите в 2^n. От друга страна за да имаме представа колко информация може да се съдържа ни трябва единица за информация. Титла: Re: побитови полета Публикувано от: dwni2 в Mar 02, 2011, 23:23 добре а в този пример означава че структурата се състои от 3 бита ли
int main(void){ struct l{ int a:1; int b:1; int c:1; }i; return 0;} обяснете ми моля ви начина на работа на побитожите полета че четох от една книга и не ми стана ясноо Титла: Re: побитови полета Публикувано от: senser в Mar 02, 2011, 23:41 По-сбито: http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html ($2) и по-подробно: http://en.wikipedia.org/wiki/Bit_field ($2)
Титла: Re: побитови полета Публикувано от: VladSun в Mar 02, 2011, 23:47 Типичен пример за побитово поле са правата на файловете в Линукс.
Ако вземем само едната "група" права - прим. тази на собственика имаме 3-битове поле: read - write - execute Всеки бит от информация еднозначно определя "ДА или НЕ", "ИСТИНА или ЛЪЖА", "0 или 1" и т.н. Това де факто е точно "бит информация". Броят комбинации от стойности на n бита (побитово поле или по-сложна структура) при пълно комбиниране е точно 2n. Има случаи когато реално информацията в едно побитово поле може да се окаже по-малко от максималната - при "загуба" или "забрана" на някои комбинации. Прим. ако имаме X1 ... Xn битове, но прим. стойността на X5 има смисъл тогава и само тогава когато Х4 е логическа "1". Тогава казваме,че има корелация (връзка, зависимост) между Х5 и Х4 и общото количество информация носено от X1 ... Xn става по-малко от максимално възможното - 2n. Казано по друг начин - намалили сме хаоса (ентропията) в системата, следователно тя става по-малко хаотична, "знаем"повече за нея, тя може да ни "изненада" по-малко и следователно обемът информация в нея намалява. :) Крайният вариант - една напълно "подредена" система (липсва хаос, ентропията е нула), в която знаем всичко. Прим., ако отговорът на един въпрос е винаги ДА, то получаването му не носи никаква информация. По друг начин казано, имаме 100% корелация между всеки един отделен отговор :) Нещо много се разфилософствах, май по-добре да ходя да си лягам :) Титла: Re: побитови полета Публикувано от: dwni2 в Mar 03, 2011, 10:27 благодаря
добре защто когато присвоя на g.l=4; например ми дава предупреждение компилатора warning: overflow in implicit constant conversion Код
Титла: Re: побитови полета Публикувано от: clovenhoof в Mar 03, 2011, 13:16 Естествено че ще ти дава предупреждение.
Заделил си 2 бита памет за променливата l . Броя на възможните стойности на l е 2^2 = 4, или това са: 0, 1, 2, 3 . Числото 4 заема 3 бита и не се побира в двата бита заделени от теб. Титла: Re: побитови полета Публикувано от: dwni2 в Mar 03, 2011, 13:56 значи ако задам по голяма стойност за променивата от заделените битове няма да работи нали
Титла: Re: побитови полета Публикувано от: dwni2 в Mar 03, 2011, 13:57 а как мога да разбера колко бита е едно число
Титла: Re: побитови полета Публикувано от: b2l в Mar 03, 2011, 14:05 а как мога да разбера колко бита е едно число Ми сигурно по типа на числото и на компилатора. Титла: Re: побитови полета Публикувано от: dwni2 в Mar 03, 2011, 14:46 ами аз прожерявам стоиноста на дадена променлива със sizeof за int ми показва 4
но не мога да разбера разликата на стоиностите на побитовите полета с тази типа променлива Титла: Re: побитови полета Публикувано от: kokoex в Mar 03, 2011, 16:31 ами аз прожерявам стоиноста на дадена променлива със sizeof за int ми показва 4 sizeof ти връща размера на променливата в байтове които ще заеме в паметта. Умножаваш резултата върнат от sizeof по броят битове в един байт(8) и си готов. Почети малко повечко за видовете променливи в C :) Титла: Re: побитови полета Публикувано от: clovenhoof в Mar 03, 2011, 19:20 ами аз прожерявам стоиноста на дадена променлива със sizeof за int ми показва 4 Не знам защо се интересуваш от битови полета, но те се използват само за удобство. Със същия успех (в голяма част от случаите) може да използваш за тип int и побитови операции за да манипулираш този тип. Понеже не можеш да адресираш памет по-малка от един байт, размера на структурата с побитови полета, винаги се допълва до байт (най-малко). Може да си поиграеш с типовете на побитовите полета или да прочетеш спецификациите на езика. Мен ме мързи да се занимавам с това. Цитат а как мога да разбера колко бита е едно число Има калкулатор за целта (статично). Програмно - има понятия като LSB и MSB. Виж в гуугле. Most Significant Bit, ти показва индекса на най-старшия бит след който всички битове са нули. В общия случай това не ти трябва. Щом не си сигурен за размера на променливата, просто използвай int и не се занимавай с простотии като побитови полета. Титла: Re: побитови полета Публикувано от: dwni2 в Mar 04, 2011, 19:47 оки разбрах какво представляват всеки бит се заема последователно или от края към началото или обратно но не мога да разбера как се изчислчва колко бита е едно число например числата от едно до десет моля ви обяснете ми
Титла: Re: побитови полета Публикувано от: b2l в Mar 04, 2011, 19:52 оки разбрах какво представляват всеки бит се заема последователно или от края към началото или обратно но не мога да разбера как се изчислчва колко бита е едно число например числата от едно до десет моля ви обяснете ми Ама що за глупости - да не си мислиш, че: 1 = 1 bit, 2 = 13bits, 3 = 7bits, etc... Титла: Re: побитови полета Публикувано от: clovenhoof в Mar 04, 2011, 20:12 Бинарен код, двоична система ... . Разбери тези неща, щото явно не ги знаеш и тогава ще си отговориш на въпроса "колко бита заема едно число".
Няма да ти изнасяме лекции. Ако има нещо за доизясняване по-става. Титла: Re: побитови полета Публикувано от: chen_dzen в Mar 04, 2011, 20:57 оки разбрах какво представляват всеки бит се заема последователно или от края към началото или обратно но не мога да разбера как се изчислчва колко бита е едно число например числата от едно до десет моля ви обяснете миДелиш на 2 и записваш остатъка ето така : 10/2 = 5 (0 5/2 = 2 (1 2/2 = 0 (0 0/2 = 0 (1 Гледаш остатъка отдоло нагоре и това ти е двоично 1010 ;) ако не се бъркам нещо . Титла: Re: побитови полета Публикувано от: clovenhoof в Mar 04, 2011, 21:38 Петък вечер е, така че лек бонус:
Код
Показва колко бита заема всяко число от 1 до 10. Говорих ти за MSB, ама ти не четеш. ПП: Компилира се под Windows. Под Linux трябва да се редактира. Титла: Re: побитови полета Публикувано от: dwni2 в Mar 06, 2011, 20:12 ок мерси
|