Автор Тема: побитови полета  (Прочетена 4053 пъти)

dwni2

  • Напреднали
  • *****
  • Публикации: 79
    • Профил
побитови полета
« -: Mar 02, 2011, 21:44 »
Имам няколко въпроса относмо употребата на побитови полета в C. Каква информация може да се съдържа в едно побитово поле? Какъв обем информация може да се съдържа и как зависи обема от брия на битовете на полето? :)
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: побитови полета
« Отговор #1 -: Mar 02, 2011, 22:29 »
2n

n - брой битове
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

shoshon

  • Напреднали
  • *****
  • Публикации: 497
    • Профил
Re: побитови полета
« Отговор #2 -: Mar 02, 2011, 23:10 »
 Това е доста интересен въпрос. Не съм чел, но ми е много интересно какво ще отговорят другите?
Значи побитово поле можем да наричаме пространството в което действат побитови оператори, нали така ?
Ако дефинираме побитово поле като 2^n трябва да натоварим дпълнително операторите в 2^n.

От друга страна за да имаме представа колко информация може да се съдържа ни трябва единица за информация.
Активен

dwni2

  • Напреднали
  • *****
  • Публикации: 79
    • Профил
Re: побитови полета
« Отговор #3 -: Mar 02, 2011, 23:23 »
добре а в този пример означава че структурата се състои от 3 бита ли 

int main(void){
struct l{
int a:1;
int b:1;
int c:1;
}i;
return 0;}
обяснете ми моля ви начина на работа на побитожите полета че четох от една книга и не ми стана ясноо
Активен

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Re: побитови полета
« Отговор #4 -: Mar 02, 2011, 23:41 »
По-сбито: http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html и по-подробно: http://en.wikipedia.org/wiki/Bit_field
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: побитови полета
« Отговор #5 -: Mar 02, 2011, 23:47 »
Типичен пример за побитово поле са правата на файловете в Линукс.
Ако вземем само едната "група" права - прим. тази на собственика имаме 3-битове поле:
read - write - execute

Всеки бит от информация еднозначно определя "ДА или НЕ", "ИСТИНА или ЛЪЖА", "0 или 1" и т.н. Това де факто е точно "бит информация".

Броят комбинации от стойности на n бита (побитово поле или по-сложна структура) при пълно комбиниране е точно 2n.

Има случаи когато реално информацията в едно побитово поле може да се окаже по-малко от максималната - при "загуба" или "забрана" на някои комбинации.

Прим. ако имаме X1 ... Xn битове, но прим. стойността на X5 има смисъл тогава и само тогава когато Х4 е логическа "1". Тогава казваме,че има корелация (връзка, зависимост) между Х5 и Х4 и общото количество информация носено от X1 ... Xn става по-малко от максимално възможното - 2n. Казано по друг начин - намалили сме хаоса (ентропията) в системата, следователно тя става по-малко хаотична, "знаем"повече за нея, тя може да ни "изненада" по-малко и следователно обемът информация в нея намалява. :)

Крайният вариант - една напълно "подредена" система (липсва хаос, ентропията е нула), в която знаем всичко.
Прим., ако отговорът на един въпрос е винаги ДА, то получаването му не носи никаква информация.
По друг начин казано, имаме 100% корелация между всеки един отделен отговор :)

Нещо много се разфилософствах, май по-добре да ходя да си лягам :)
« Последна редакция: Mar 03, 2011, 01:58 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

dwni2

  • Напреднали
  • *****
  • Публикации: 79
    • Профил
Re: побитови полета
« Отговор #6 -: 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.  
« Последна редакция: Mar 06, 2011, 20:29 от VladSun »
Активен

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: побитови полета
« Отговор #7 -: Mar 03, 2011, 13:16 »
Естествено че ще ти дава предупреждение.

Заделил си 2 бита памет за променливата l .
Броя на възможните стойности на l е 2^2 = 4, или това са: 0, 1, 2, 3 .
Числото 4 заема 3 бита и не се побира в двата бита заделени от теб.
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

dwni2

  • Напреднали
  • *****
  • Публикации: 79
    • Профил
Re: побитови полета
« Отговор #8 -: Mar 03, 2011, 13:56 »
значи ако задам по голяма стойност за променивата от заделените битове няма да работи нали
Активен

dwni2

  • Напреднали
  • *****
  • Публикации: 79
    • Профил
Re: побитови полета
« Отговор #9 -: Mar 03, 2011, 13:57 »
а как мога да разбера колко бита е едно число
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: побитови полета
« Отговор #10 -: Mar 03, 2011, 14:05 »
а как мога да разбера колко бита е едно число

Ми сигурно по типа на числото и на компилатора.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

dwni2

  • Напреднали
  • *****
  • Публикации: 79
    • Профил
Re: побитови полета
« Отговор #11 -: Mar 03, 2011, 14:46 »
ами аз прожерявам стоиноста на дадена променлива със sizeof за int ми показва 4
но не мога да разбера разликата на стоиностите на побитовите полета с тази
типа променлива
Активен

kokoex

  • Напреднали
  • *****
  • Публикации: 46
  • Distribution: Gentoo
  • Window Manager: XFCE
    • Профил
Re: побитови полета
« Отговор #12 -: Mar 03, 2011, 16:31 »
ами аз прожерявам стоиноста на дадена променлива със sizeof за int ми показва 4
но не мога да разбера разликата на стоиностите на побитовите полета с тази
типа променлива

sizeof ти връща размера на променливата в байтове които ще заеме в паметта. Умножаваш резултата върнат от sizeof по броят битове в един байт(8) и си готов.
Почети малко повечко за видовете променливи в C :)
Активен

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: побитови полета
« Отговор #13 -: Mar 03, 2011, 19:20 »
ами аз прожерявам стоиноста на дадена променлива със sizeof за int ми показва 4
но не мога да разбера разликата на стоиностите на побитовите полета с тази
типа променлива

Не знам защо се интересуваш от битови полета, но те се използват само за удобство.
Със същия успех (в голяма част от случаите) може да използваш за тип int и побитови операции за да манипулираш този тип.

Понеже не можеш да адресираш памет по-малка от един байт, размера на структурата с побитови полета, винаги се допълва до байт (най-малко). Може да си поиграеш с типовете на побитовите полета или да прочетеш спецификациите на езика. Мен ме мързи да се занимавам с това.

Цитат
а как мога да разбера колко бита е едно число

Има калкулатор за целта (статично). Програмно - има понятия като LSB и MSB. Виж в гуугле.
Most Significant Bit, ти показва индекса на най-старшия бит след който всички битове са нули.

В общия случай това не ти трябва. Щом не си сигурен за размера на променливата, просто използвай int и не се занимавай с простотии като побитови полета.
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

dwni2

  • Напреднали
  • *****
  • Публикации: 79
    • Профил
Re: побитови полета
« Отговор #14 -: Mar 04, 2011, 19:47 »
оки разбрах какво представляват всеки бит се заема последователно или от края към началото или обратно но не мога да разбера как се изчислчва колко бита е едно число например числата от едно до десет моля ви обяснете ми
Активен