- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
# https://www.opennet.ru/opennews/art.shtml?num=53248
# Гвидо ван Россум предложил включить в Python операторы для сопоставления с образцом
# Отмечается, что предложенные операторы позволят улучшить читаемость кода,
# упростят сопоставление произвольных Python-объектов и отладку, а также повысят
# надёжность кода благодаря возможности расширенной статической проверки типов.
def http_error(status):
match status:
case 400:
return "Bad request"
case 401|403|404:
return "Not allowed"
case 418:
return "I'm a teapot"
case _:
return "Something else"
# Например, возможна распаковка объектов, кортежей, списков и произвольных последовательностей
# для привязки переменных на основе имеющихся значений. Допускается определение вложенных
# шаблонов, использование в шаблоне дополнительных условий "if", применение масок ("[x, y, *rest]"),
# маппинга связок ключ/значение (например, {"bandwidth": b, "latency": l} для извлечения значений
# "bandwidth" и "latency" и словаря), извлечения подшаблонов (оператор ":="), использования именованных
# констант в шаблоне. В классах возможна настройка поведения при сопоставлении при помощи метода "__match__()".
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
def whereis(point):
match point:
case Point(0, 0):
print("Origin")
case Point(0, y):
print(f"Y={y}")
case Point(x, 0):
print(f"X={x}")
case Point():
print("Somewhere else")
case _:
print("Not a point")
match point:
case Point(x, y) if x == y:
print(f"Y=X at {x}")
case Point(x, y):
print(f"Not on the diagonal")
RED, GREEN, BLUE = 0, 1, 2
match color:
case .RED:
print("I see red!")
case .GREEN:
print("Grass is green")
case .BLU
E:
print("I'm feeling the blues :(")
> Python этим то и хорош, что не тащить всякий мусор в виде дублирующих операторов!
> Посмотрите что с С++ сотворили, чужие исходники читать трудновато.
> Меньше операторов это главное что отличает современные языки вроде Go, Rust в результате читаемость чужих исходников резко повышается!
Предлагаю Brainfuck: там всего 8 операторов '+', '-', '<', '>', '[', ']', '.', ','
Или такая идея: вызывать какую-нибудь функцию, которая будет реализовывать это фоллсру:
Именно поэтому я за https://www.jsoftware.com/help/dictionary/csel.htm
push dword 0
pop eax
zero dd 0
...
mov eax, [zero]
...
push offset zero
call _atoi
sal eax, 32
shr eax, 16
shr eax, 16
shl eax, 16
shl eax, 16
Ну или shr rax, 32 и забить на старшие биты. Сами отвалятся после 32-битных операций.
BTR eax, 1
BTR eax, 2
BTR eax, 3
BTR eax, 4
BTR eax, 5
BTR eax, 6
BTR eax, 7
BTR eax, 8
BTR eax, 9
BTR eax, 10
BTR eax, 11
BTR eax, 12
BTR eax, 13
BTR eax, 14
BTR eax, 15
BTR eax, 16
BTR eax, 17
BTR eax, 18
BTR eax, 19
BTR eax, 20
BTR eax, 21
BTR eax, 22
BTR eax, 23
BTR eax, 24
BTR eax, 25
BTR eax, 26
BTR eax, 27
BTR eax, 28
BTR eax, 29
BTR eax, 30
BTR eax, 31
Я думал, просто ANDят с нужным числом, где нолики везде, кроме нужного бита.
Но получается гораздо больше действий
Я делал когда-то так:
Вроде, работало.
Но через инструкцию правда круче.
Ты можешь просто сказать "дай мне бит номер 3" без всей этой ебли c эндом
Как-то так случалось, то у меня не было неизвестного n, и даже наоборот: у меня была переменная, и я знал все флаги (или сам их писал, или брал из SDK)
И долго не мог понять, где обосрался. Да еще и дважды.
Прост в другом месте было == 0. Вот и инвертировал.
Видел, как некоторые пишут
и не обсираются. Наверное, тоже боятся неявных кастов в буль-буль.
>Я делал когда-то так:
>#define PETUH_BIT 0x10
>if (flags & PETUH_BIT)
Нееее. Анскильные макаки делали примерно так:
Это уж скорее анскильные ма-те-ма-ти-ки.
А потом начали сдвигать, потому что деления не было плавающий питух тормозит.
Я просто привык, что все ANDят с числом, но с этой инструкией удобнее.
Вспомнил как впервые я первые познакомился с битовой питушней.
Я был совсем мелким пзидюком, и писал чото под турбовижен кажется, и спросил препода "как проверить, какие из чекбоксов влкючены", а он и говорит "вот тут число, в нем каждый бит это факт включения чекбокса".
Если память не спит с другим, то так оно всё и было
Одна из них считает целую часть логарифма по основанию 2 исходного аргумента, а другая находит логарифм по основанию 2 наибольшего делителя, являющегося степенью двойки.
mov eax, 0xFFFFFFFF
cpuid
З.Ы. А тьфу, для scasd уже понадобится 0. Придётся просто загружать и тестить.
Ну в современных осях тоже должны найтись нули в тредлокал сегменте, на который ссылаются FS или GS.
dec eax
jnz loop
Брейнфак-стайл.
Странно что никто не предложил такой способ
Какой анролл )))
http://z0mbie.daemonlab.org/21zero.html
>> вот чего тут нет - так это полных извращений, типа обнуления по одному
биту, автогенерируемого кода и т.п.
Придётся устранить это недоразумение. Есть идеи?
Осталось только позвать автогенерируемого кота.
Мой пример с times 32. Он в 32 сложения раскроется.
Но можно найти в библиотеках фрагменты, которые зануляют eax и возвращают управление. Они должны очень часто встречаться в сишном коде.
Хм. Это первое что пришло мне в голову, когда посоны объявили спец. олимпиаду.
это лучший имхо