68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
|
||||||||||||||||
1 | ||||||||||||||||
Логическое значение у переменной08.09.2023, 17:14. Показов 869. Ответов 9
Метки нет (Все метки)
Иногда нужно чтобы определённая переменная имела только логическое значение
ноль или единица так называемое булево значение например при отработки какого нибудь алгоритма каждый раз у переменной менялось бы логическое значение это конечно можно сделать обычным условным ветвлением
но поменять логическое значение можно и более быстрым способом
по сути это конечно то что нам и нужно но если по какой то случайности в переменной будет другое значение этот способ не даст ожидаемого результата есть ли другой способ по мимо условного ветвления делать так чтобы если в переменной ноль в ней появлялось бы например любое не нулевое значение и соответственно если в переменной любое не нулевое значение в ней появлялся бы ноль например если для подобной логики использовать однобайтовую переменную то в данном случае есть сто процентный способ который тоже выполнится чуть быстрее чем условное ветвление
для подобных логических переменных по сути и нужно использовать однобайтный тип по тому что для нуля или единицы четыре байта многовато будет но просто ради интереса есть ли другой способ по мимо условного ветвления у четырёх байтовых переменных кто в теме подскажите пожалуйста
0
|
08.09.2023, 17:14 | |
Ответы с готовыми решениями:
9
Логическое значение переменной Присвоить переменной логическое значение в соответствии с правилом Присвоить логической переменной t значение true, если выполняется логическое условие Логическое выражение из переменной в блоке If .. Then |
1606 / 1508 / 251
Регистрация: 19.02.2010
Сообщений: 4,071
|
|
08.09.2023, 18:16 | 2 |
У четырёхбайтовых переменных, например, есть вариант с
bswap Помещаешь в регистр значение 1000000h или 1h, в зависимости от того, какое начальное значение младшего байта (0 или 1) будет нужно. Булева переменная лежит/проверяется в младшем байте регистра, а в старшем байте лежит её второе возможное состояние. После команды bswap значения этих байтов меняются местами.А что, отменили условное ветвление после проверки значения 1байтовой переменной? Есть CMP r/m8, imm8 , CMP r/m8, r8 , CMP r8, r/m8 - т.к. дофига возможных вариантов/комбинаций с размещением переменной (регистр, память) и значения для сравнения (непосредственное значение, регистр, память).
0
|
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
|
|
08.09.2023, 18:51 [ТС] | 3 |
вариант с - bswap
при котором надо делать проверку младшего и старшего байта я уж не говорю о том что значение переменной нужно сначало поместить в регистр а потом соответственно и обратно по сути не имеет смысл по тому что банальное условное ветвление которое под капотом использует - cmp по скорости сделает это гораздо быстрее
0
|
1606 / 1508 / 251
Регистрация: 19.02.2010
Сообщений: 4,071
|
|
08.09.2023, 21:06 | 4 |
Или крестик сними - или трусы надень
Вопрос был задан про другие варианты, а не про сравнение скоростей: bswap здесь позволяет держать в 4 байтах (вернее, в двух, с двумя неиспользуемыми промежуточными) ВСЮ НУЖНУЮ СЕМАНТИКУ данных (а именно - наше предположение/решение/ограничение о том, что булева переменная в данном случае будет иметь всего 2 значения, без возможности интерпретации любого ненулевого значения как true). 32разрядный код уже давно мало кому интересен, а в 64разрядном режиме добавлено 8 РОНов. Младшие байты (для того, чтобы для условных проверок байтовую булеву переменную брать оттуда) у этих новых РОНов тоже доступны - r8l,...,r15l. Т.е. в современных условиях будет существовать ДОСТАТОЧНО программ (вариант - кусков кода), в которых нужная переменная будет ВСЕГДА лежать в регистре, без необходимости её загрузки/выгрузки в память.
0
|
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
|
||||||
09.09.2023, 04:52 [ТС] | 5 | |||||
VTsaregorodtsev, спасибо за участие в теме
в принципи я хотел сделать макрос например - logic с одним параметром что то типа
и желательно чтобы не портились регистры
0
|
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
|
|||||||||||||||||||||
09.09.2023, 14:42 [ТС] | 6 | ||||||||||||||||||||
на дружественном форуме предложили варианты
по этому думаю что если для логического значения будет использоваться переменная 1-байтовая или 2-байтовая или 4-байтовая
8-разрядный или 16-разрядный или 32-разрядный
0
|
-12 / 5 / 0
Регистрация: 04.03.2023
Сообщений: 38
|
||||||
11.09.2023, 21:13 | 7 | |||||
0
|
Модератор
|
|
11.09.2023, 21:20 | 8 |
Да, можно и так, до тех пор, пока не прочитаешь о конвейере команд и его очистке после выполнения инструкции перехода. А к этому, ещё и о "нерезиновом" кэше и последствиях отсутствия в нём копии памяти, на которую осуществляется переход.
0
|
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
|
||||||
11.09.2023, 23:56 [ТС] | 9 | |||||
_Strange_, как альтернатива да но это по сути тоже самое что и
спасибо за участие
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
09.11.2023, 10:17 | 10 |
0
|
09.11.2023, 10:17 | |
09.11.2023, 10:17 | |
Помогаю со студенческими работами здесь
10
Надо вывести название переменной, тип данных переменной, значение переменной Надо вывести название переменной, тип данных переменной, значение переменной Логической переменной R присвоить логическое выражение, реализующее указанное условие Получить адрес переменной, вывести его, сменить значение переменной через указатель, вывести значение Присвоить значение наименьшего элемента массива переменной М1, номер строки, где находится этот элемент, - переменной Т, номер столбца - переменной С логическое значение высказывания Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |