Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: dwni2 в Mar 02, 2011, 21:44



Титла: побитови полета
Публикувано от: 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

Код
GeSHi (C):
  1. #include <stdio.h>
  2. int main(void){
  3. struct w{
  4. int a:4;
  5. int l:2;
  6. }g;
  7. g.l=4;
  8. printf("%d", g.l);
  9. return 0;}
  10.  
  11.  
  12.  


Титла: 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
Петък вечер е, така че лек бонус:

Код
GeSHi (C):
  1. #include <stdio.h>
  2.  
  3. __forceinline int MSB(int x)
  4. {
  5. __asm bsr eax, dword ptr x
  6. }
  7.  
  8. int main(void)
  9. {
  10. for (int i = 1; i < 11; ++i)
  11. {
  12. printf("%d -> %d bits\n", i, MSB(i) + 1);
  13. }
  14.  
  15. return 0;
  16. }
  17.  

Показва колко бита заема всяко число от 1 до 10.
Говорих ти за MSB, ама ти не четеш.

ПП: Компилира се под Windows. Под Linux трябва да се редактира.


Титла: Re: побитови полета
Публикувано от: dwni2 в Mar 06, 2011, 20:12
ок мерси