7 ms·
So many to choose from ... Convert single char c into an integer: int value = '0' - c; Get the length of a static string you can use sizeof() instead of
by snorkel 15y ago
So many to choose from ...
Convert single char c into an integer:
int value = '0' - c;
Get the length of a static string you can use sizeof() instead of strlen()
int len1 = sizeof("hello"); // compile-time string length
A fast and simple ring buffer (borrowed from Quake code)
UPDATE_MASK = ARRAY_SIZE - 1;
array[i++ & UPDATE_MASK] = data;
Init all bits of a mask to 1 on any architecture:
unsigned int flags = -1;
- matthavener 15y agoThe ring buffer is a nice trick, but it only works on array sizes that are a multiple of 2. The generalized version would be "array[i++ % ARRAY_SIZE] = data". If ARRAY_SIZE happens to be a multiple of two, I'm sure most compilers would optimize to a bitmask anyways..
- deleted 15y ago[deleted]
- mansr 15y agoAnd if it is not a power of 2, the % operation will be anything but fast. If a size not a power of 2 is strictly required, a simple increment and compare is almost certainly faster.
- xtacy 15y agoI think you meant: int value = c - '0'; Otherwise, value will be negative.
- mansr 15y agoI think you meant int value = c - '0'; Also, remember that sizeof("string") includes the null terminator while strlen() does not.
- tptacek 15y agoIf you want all-ones, shouldn't you just use ~0?
- mansr 15y agoNo. ~0 has type signed int, which on a one's complement machine is a negative zero. Converting this to an unsigned type yields zero. On a sign-magnitude machine, ~0 is -0x7fffffff (assuming 32-bit for simplicity). Conversion to unsigned 32-bit is done by adding 0x100000000, yielding 0x80000001, again not what was desired. If the variable being assigned to has a width different from that of int, things get even more interesting.
- tptacek 15y agoAh. Thanks! Is there a ones-complement or sign-magnitude architecture still in production anywhere? (I'm curious; I have no idea.)
- joel4039 15y agoAs far as I know analog devices still makes some ones-complement Analog to Digital Converters. But I don't know of any modern processor that uses them.
- wglb 15y agoHow about ~0U?
- mansr 15y agoThat will only set as many bits as are in an int, which is wrong if the type of the variable you are setting is wider than int. For a long, you could of course use ~0ul, and so on for other types, but then you'd have to find and update every such assignment if the variable were ever changed to a wider type.
- JoachimSchipper 15y agoSigned integer overflow is undefined, so make sure you're using an unsigned type in your ringbuffer example. (And an array with some-power-of-2 elements; you should probably use sizeof(array)/sizeof(<star> array) instead of ARRAY_SIZE too.)