Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];

Вниз

О битовой математике   Найти похожие ветки 

 
kyn66 ©   (2009-11-17 17:25) [0]

Дабы не зайти в заблуждение, изучая материал статьи, которую написал Anatoly Podgoretsky, http://www.podgoretsky.com/ddp/bits.aspx Вопрос хотел задать конкретно Сергею М.Т.к. от него был получен ответ. Ну и автору статьи, если он не против.  Непонятны некоторые моменты, а именно. В статье написано, что рассчитываем позицию бита (1 shl Bit) Т.е. делаем логический сдвиг влево на 1 позицию бита под номером Bit. В моем вопросе(Сохранение параметров программы одним числом (http://delphimaster.net/view/2-1257412567/)) и сохраняю значения CheckBox-ов в цикле

for i := 0 to 6 do
  WeekDaysMask := WeekDaysMask or Byte(CheckBox[i].Checked) shl i;

Если можно, объесните популярнее, ведь у меня и так (0 Shl Bit) может получиться. Есть ли неувязка со статьей. Далее автор пишет затем устанавливаем полученный бит и возвращаем результат через предопределенную переменную Result. Чем устанавливаем, не понятно? Е второй вопрос, что дает комбинация WeekDaysMask := WeekDaysMask or Byte(C.... За счет чего и как аккумулируется WeekDaysMask. На простую математику не похоже. В режиме отладки пытаюсь понять аккумуляцию... но.
И как при получении значений для CheckBox - ов

for i := 0 to 6 do
  CheckBox[i].Checked := (WeekDaysMask and (1 shl i)) <> 0;

Как влияет AND в данном месте на поиск конкретного числа для конкретного бита? В интернете пестрят только статьи АП, которая у меня распечатана под рукой.


 
Омлет ©   (2009-11-17 17:28) [1]

function GetBit(const Mask: LongWord; const Idx: Byte): Boolean;
begin
 Result := (Idx < 32) and ((Mask and (1 shl Idx)) <> 0);
end;

procedure SetBit(var Mask: LongWord; const Idx: Byte; const Value: Boolean);
begin
 if Value then
   Mask := Mask or (1 shl Idx)
 else
   Mask := Mask and not (1 shl Idx);
end;


 
12 ©   (2009-11-17 17:39) [2]

and - побитовое сложение, (1 and 1 = 1, 0 and X = 0)
WeekDaysMask and (байт где все нули и одна единица на I-том месте) будет не равно 0, если в WeekDaysMask единица на том же месте.
т.е. I-тый бит в WeekDaysMask установлен в 1


 
12 ©   (2009-11-17 17:44) [3]

соответственно,
WeekDaysMask and байтБ(где не все нули) будет <>0, если в WeekDaysMask хоть 1 единица на том же месте что и в этом байтеБ


 
Юрий Зотов ©   (2009-11-17 17:50) [4]

> В статье написано, что рассчитываем позицию бита (1 shl Bit)
> Т.е. делаем логический сдвиг влево на 1 позицию бита под номером Bit.

Неверно. Берем двоичное представление десятичной единицы (то есть, байт с содержимым 00000001) и сдвигаем его влево на Bit двоичных разрядов. А вовсе не "сдвиг влево на 1 позицию бита под номером Bit".

Если, например, Bit было равно 5, то в результате этой операции получим байт с содержимым 00100000 - то есть, десятичное число 32.


 
kyn66 ©   (2009-11-17 17:55) [5]

Допустим при определенной комбинации битов WeekDaysMask=85. При получении значений

for i := 0 to 6 do
 CheckBox[i].Checked := (WeekDaysMask and (1 shl i)) <> 0;

Имеем следующее, условимся (WeekDaysMask and (1 shl i)) - это W, тогда

i   | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
----------------------------
W | 1 | 0 | 4 | 0 |16| 0 | 64|

Отметятся чекбоксы 0, 2, 4, 6 . Так и должно быть . Как выбираются "правильные" веса из WeekDaysMask ?


 
kyn66 ©   (2009-11-17 17:58) [6]


> Если, например, Bit было равно 5, то в результате этой операции
> получим байт с содержимым 00100000 - то есть, десятичное
> число 32.


Ага, значит при (0 shl i) у меня всегда будет 0. Верно?


 
Юрий Зотов ©   (2009-11-17 18:00) [7]

Верно. Нулевой байт (где все нули) как ни двигай, там все равно одни нули всегда и будут.


 
12 ©   (2009-11-17 18:31) [8]

понять все это просто
надо посмотреть на байт - 85 d (01010101 b)
как можно догадаться, должно быть так, чтоб на и-том месте была единица, если и-тый чекбокс отмечен

далее совсем просто
01010101 = 85
76543210
for i := 0 to 6 do   WeekDaysMask and (1 shl i)
т.е. проверяем, каждый бит
00000001 and 01010101 = 1 ( i=0 )
00000010 and 01010101 = 0 ( i=1 )
00000100 and 01010101 = 1 ( i=2 )
...
и включены тут 0,2,4,6 биты


 
12 ©   (2009-11-17 18:35) [9]

00000001 and 01010101 = 1 ( i=0 )
00000010 and 01010101 = 0 ( i=1 )
00000100 and 01010101 = 1 ( i=2 )
ерунда, конечно

т.е.
00000001 and 01010101 <> 0 ( i=0 )
00000010 and 01010101 = 0 ( i=1 )
00000100 and 01010101 <> 0 ( i=2 )


 
kyn66 ©   (2009-11-17 18:36) [10]

Вот вот[8], меня с толку сразу и сбило то, что  WeekDaysMask представлен десятичным числом,а операции сложения приходится выполнять с двоичным. Значит компилятор сам его приводит к двоичному виду?


 
Jeer ©   (2009-11-17 18:41) [11]


> Значит компилятор сам его приводит к двоичному виду?


А Вы в курсе, что тот компьютер, который у Вас на столе, работает в двоичной логике ?


 
kyn66 ©   (2009-11-17 18:47) [12]


> 12 ©   (17.11.09 18:35) [9]
> 00000001 and 01010101 = 1 ( i=0 )
> 00000010 and 01010101 = 0 ( i=1 )
> 00000100 and 01010101 = 1 ( i=2 )
> ерунда, конечно


Да, не успел я задать вопрос, а откуда тогда у меня взялись числа W | 1 | 0 | 4 | 0 |16| 0 | 64| ? :)


 
kyn66 ©   (2009-11-17 18:48) [13]


> А Вы в курсе, что тот компьютер, который у Вас на столе,
>  работает в двоичной логике ?


Это я понял, просто я вижу число 85, а компу походу фиолетово что я вижу, для него это число 1010101.


 
Дмитрий Белькевич   (2009-11-17 18:56) [14]

При операции AND часто одно из операндов является маской (даже переменная так названа - WeekDaysMask). В данном случае - WeekDaysMask. В маске указывается (установкой логических единиц в соответствующих разрядах), какие биты нам интересны для сравнения, а какие нужно замаскировать (установкой логических нулей). Далее, с помощью простой и быстрой операций сравнения с нулём (имеются в виду ассемблерные операции - test, например), можно узнать, были ли в другом операнде установлены (то есть равны единице) биты, соответсвующие битам, установленным в маске.


 
kyn66 ©   (2009-11-17 18:57) [15]

Все, я понял, благодаря [8]+[9] картина прояснилась. Осталось научиться и понять как правильно складывать двоичные числа. Спасибо , 12.

Теперь давайте разберем вторую ситуацию с OR

for i := 0 to 6 do
 WeekDaysMask := WeekDaysMask or Byte(CheckBox[i].Checked) shl i;

Т.е., как аккумулируется  WeekDaysMask. Надо полагать по логике оно тоже будет иметь двоичный вид, просто биты будут располагаться в определенныъх местах в зависимости от состояния чекбокса. Хм. но сохраняю я его(пусть в реестре) всеравно в десятичном виде. Это кажется не важно.


 
Дмитрий Белькевич   (2009-11-17 19:00) [16]


> Это я понял, просто я вижу число 85, а компу походу фиолетово
> что я вижу, для него это число 1010101.


Комп зелёного понятия не имеет ни о каких числах, переменных, экзешниках, операционках и так далее. У него только ячейки памяти, который хранят исключительно нули и единицы. И еще куча железа, которая эти нули/единицы тусует туда-сюда согласно внутренних правил.


 
Дмитрий Белькевич   (2009-11-17 19:02) [17]


>  Хм. но сохраняю я его(пусть в реестре) всеравно в десятичном
> виде. Это кажется не важно.


Еще раз. Забудь про системы счисления.


 
Дмитрий Белькевич   (2009-11-17 19:03) [18]

Это только лишь удобное для человека представление информации.


 
kyn66 ©   (2009-11-17 19:15) [19]


> Это только лишь удобное для человека представление информации.

Понял! Блин, это давольно интересно(когда понимаешь о чем речь). Параллельно уже научился складывать двоичные числа. Но [15] все еще актуально. Тоько нужно подправить немного WeekDaysMask := WeekDaysMask or (Byte(CheckBox[i].Checked) shl i)


 
oldman ©   (2009-11-17 19:42) [20]


> Вопрос хотел задать конкретно Сергею М.Т.к. от него был
> получен ответ. Ну и автору статьи, если он не против.


Не понимаю.
Почту отменили?
Обратись к первоисточнику.
Тем более, что сам АП почему-то молчит в этой ветке.


 
kyn66 ©   (2009-11-17 19:46) [21]

Я наверное рано обрадовался, научившись складывать двоичные числа в столбик

1010101   1010101
+            +
0000001   0000010
---------  ---------
1010110   1010111

и т.д. в итоге, перебирая каждый байт и складывая с WeekDaysMask(85) я получил ряд чисел (86, 87, 89, 93, 101, 117, 149) что с разницей с 85 давало другой ряд(1, 2, 4, 8, 16, 32, 64). Я понял что что-то здесь не то. Оказывается нужно просто было сравнивать смещаемый бит с WeekDaysMask(85(1010101)) битом в том же ряду через AND/ А у него 1 будет только тогда, когда оба бита равны 1. Пречитав более внимательно [2] понял и его смысл.


 
kyn66 ©   (2009-11-17 19:48) [22]


> Не понимаю.Почту отменили?Обратись к первоисточнику.Тем

У него в профиле не указана емеля.

> более, что сам АП почему-то молчит в этой ветке.

Он вклинится, когда постов накопится за 100 :)


 
Игорь Шевченко ©   (2009-11-17 20:01) [23]

для первоклассников существует школа.


 
kyn66 ©   (2009-11-17 20:05) [24]


> для первоклассников существует школа.

Я в курсе. И класс состоит не из одного человека, а минимум из 30-ти :).
Я разобрался. Со вторым вариантом все тоже самое, только логика другая. Вопрос можно закрыть . Всем большое спасибо.


 
Anatoly Podgoretsky ©   (2009-11-17 20:53) [25]

> kyn66  (17.11.2009 17:25:00)  [0]

> Т.е. делаем логический сдвиг влево на 1 позицию бита под номером Bit

Строго на оборот, не на одну позицию и не бит, а 1 на указаное количество бит


 
Anatoly Podgoretsky ©   (2009-11-17 20:54) [26]

> kyn66  (17.11.2009 17:58:06)  [6]

Да будет всегда ноль, поскольку смысла данная операция не имеет, смещают всегда только 1


 
Anatoly Podgoretsky ©   (2009-11-17 20:59) [27]

> oldman  (17.11.2009 19:42:20)  [20]

Я не молчу я сразу на капу нажал, как только увидел этот изумительный бред, чувствую, что и эта ветка будет более чем на 100 постов. А есть примета если в ветке много постов, то это гнилая ветка.


 
Игорь Шевченко ©   (2009-11-17 21:19) [28]


> Я не молчу я сразу на капу нажал


Скрипач свидетель


 
kyn66 ©   (2009-11-17 23:01) [29]


> как только увидел этот изумительный бред,


Как хорошо что вы такие умные... И что ж вас тогда так тянет в ветку для начинающих? Показать свое превосходство? Так мне глубоко фиолетово ... Есть люди которые не задаются  и с которыми интересно пообщаться, да пусть хоть на 200 постов ветка будет. А кому не интересно - на капу и ноги на печку. Есть темы, к которым интерес проявляется намного позже, чем этого нужно было. Все приобретается по мере необходимости. Все будешь знать - голова клина даст :)))


 
Юрий Зотов ©   (2009-11-17 23:03) [30]

> kyn66

Не сочтите за саморекламу - просто это может оказать Вам полезным:
http://www.delphikingdom.com/lyceum/seminar.asp?ID=1


 
kyn66 ©   (2009-11-17 23:08) [31]


> Юрий Зотов ©   (17.11.09 23:03) [30]
> > kyn66Не сочтите за саморекламу - просто это может оказать
> Вам полезным:


Да я не начинающий, просто некоторый материал, который сейчас непонятен, раньше был не интересен, т.к. обходился без него. А сейчас интерес проявился. И я ничего не вижу зазорного спросить разъяснения у более опытных товарищей. А за ссылочки - спасибо. Обязательно изучу. И за ответы Ваши Юрий грамотные, по теме, тоже спасибо.


 
Игорь Шевченко ©   (2009-11-17 23:45) [32]


> Да я не начинающий


тогда это диагноз


 
kyn66 ©   (2009-11-17 23:54) [33]


> тогда это диагноз

Занудство - тоже порок


 
Дмитрий Белькевич   (2009-11-17 23:54) [34]


> Да я не начинающий, просто некоторый материал, который сейчас
> непонятен, раньше был не интересен, т.к. обходился без него.
>  


Просто то, что ты спрашиваешь - это как спрашивать про буквы в букваре. Это настолько азы, насколько азы - буквы при чтении.


 
Юрий Зотов ©   (2009-11-17 23:56) [35]

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


 
Дмитрий Белькевич   (2009-11-18 00:02) [36]


> Но заметьте, что человек растет очень быстро - буквально
> не по дням, а по часам


Шансы есть, кто спорит.

Как уже здесь говорилось, любите книгу - источник знаний. Я о разных системах счисления и их применении на компьютерах узнал где-то в 5-6 класее школы. И это при том, что интернет появился только лет через 10. Информация была крайней скудна, сейчас же информации - бездонный океан, на любой вкус, цвет и уровень подготовленности.


 
Игорь Шевченко ©   (2009-11-18 00:29) [37]


> Шансы есть, кто спорит.


да и букв ограниченное количество, выучит, было бы время


 
Германн ©   (2009-11-18 01:54) [38]


> Примеры такие уже были.
>

Только похожие по скорости роста. (Имею в виду ник похожий на имя персонажа из голливудского блокбастера :).
Других примеров я не помню.


 
MonoLife ©   (2009-11-18 03:21) [39]


> Просто то, что ты спрашиваешь - это как спрашивать про буквы
> в букваре. Это настолько азы, насколько азы - буквы при
> чтении.

Учиться говорить, обычно, начинают раньше чем читать. И это не патология...


 
kyn66 ©   (2009-11-18 09:14) [40]


> Просто то, что ты спрашиваешь - это как спрашивать про буквы
> в букваре. Это настолько азы, насколько азы - буквы при
> чтении.


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



Страницы: 1 2 3 4 вся ветка

Форум: "Прочее";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.006 c
2-1260258996
VS
2009-12-08 10:56
2010.01.31
32 битные битмапы с альфой на TSpeedButton


15-1259186890
Германн
2009-11-26 01:08
2010.01.31
Мультизагрузка, boot.ini и иже с ними.


8-1201820831
cerber
2008-02-01 02:07
2010.01.31
"програмно" нажать ссылку в флеш анимации.


15-1259445310
Германн
2009-11-29 00:55
2010.01.31
Пушкин то наш...


11-1210873275
Vinum
2008-05-15 21:41
2010.01.31
Как у стринггриду запретить редактировать определенные ячейки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский