Nejsou? Myslím, že i ve vysokoúrovňových jazycích je to praktická věc (když potřebuju často vyhodnocovat kombinaci několika podmínek).
Kdyby byly přímo součástí jazyka, může na to interpret použít nějakou optimalilzaci, ale když operaci, pro kterou má většina procesorů přímo instrukce, musím řešit voláním funkce v interpretovaném jazyce, už to trochu ztrácí to kouzlo...
Asi taky jde o tu jednoduchost, a když náhodou potřebuju opravdu rychlost, tak si to mám napsat v C -- když už je to "embedded" jazyk.
Lua má knihovnu bitops. Kdyby to někomu vyloženě chybělo jako operátor -> MetaLua (zkompilované to běží na témže VM). S těmi optimalizacemi to až tak žhavé podle mě nebude, obzvlášť u jazyků typu Python nebo Ruby, které mají celkem flexibilní integery (ošetření konverze fixnum<->bignum apod.) a stejně musí čachrovat s něčím okolo. Výjimkou bude - jak už to bývá :-) - Common Lisp.
1) je tezke definovat, co tyto operatory delaji nad defaultnim ciselnym typem, coz je v Lua double. Napriklad JavaScript (taktez s jednim typem numeric) s tim ma problemy, staci si vyzkouset v prohlizeci (adresni radek + Enter):
javascript:alert(1|2)
versus
javascript:alert(1|1.99999999999)
to druhe muze byt vysledek nejake bezne pocetni operace nad doublem, klidne i jednoduchy soucet.
2) pouziti techto operatoru je dvoji: sahani na jednotlive bity napriklad v hlavickach souboru ci protokolu - zde stejne nema smysl to delat nad doublem (viz vyse, lepsi je volat nejakou c-ckovou funkci ci pouzit patch/rozsireni) a potom bitove mnoziny (to jsou ony podminky) - zde je ovsem ve vysokourovnovem jazyku IMHO vhodnejsi pouzit skutecne bitove mnoziny, ktere nejsou omezeny na 32/64 bitu, vysledek je i citelnejsi, protoze se nemusi vytvaret nejake enum-like konstanty apod.