lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Am 09.07.2013 23:54 schröbte Lorenzo Donati:

I must agree with you. Although I don't need bitops so much, I find them
useful from time to time. What I really hate is functional notation for
them: any time you try to do little-more-than-trivial stuff you end up
with ugly code (from a readability POV).

Infix notation is really a must for writing readable, straightforward
code using bitops IMHO. I'm not particularly fond of C-like operators,
so I wouldn't object to a more luaish keywords-based approach. Moreover
you cannot have exactly the same operators as in C, since ^ is already
taken,

`^` is only taken for numbers, but IMHO it doesn't make much sense to define bit operations on numbers anyway: "Let's take the number of apples and xor it with the number of oranges, right shift by the number of baskets, and we get: total nonsense"! Usually one does arithmetic _xor_ bit manipulation at any given time[*]. So my suggestion would be: Add a bunch of operators (C-like; if you are going to write C code in Lua, it should look familiar to C programmers; also: most obvious candidates for keyword operators are already taken by bit32) and metamethods, but don't define those for any builtin datatypes. Instead provide a library that implements bitstrings as userdata using those new metamethods. Added bonus: you can define bitstrings of arbitrary length, independent of the size of the integer datatype.

[*]: The one exception I can think of is implementing hash tables, where most algorithms do extensive bit fiddling to generate "unexpected" bit patterns and the result is a bucket index (i.e. a genuine number). Fortunately we already have those in Lua ...

> On 09/07/2013 20.23, Ico wrote:
>>
>>    val = val & ~mask
>>
>> for clearing bits in a word. Doing this with bit32 does not result in
>> code that is more readable, IMHO:
>>
>>    val = bit32.band(val, bit32.bnot(mask))
>>

I usually use `val = val - mask` for this, meaning "clear all bits set in mask from val". I also use `a + b` for `a | b`, and `a( b )` for `!(b & ~a)` (i.e.: check if the set of one-bits in b is a subset of one-bits in a). Together with `==` this is enough to implement the common bit flags in C APIs.


Philipp