Форум: "Прочее";
Текущий архив: 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