Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
393 views
in Technique[技术] by (71.8m points)

c - fastest way to determine if a bit is set in a integer data type

I have a method that computes a hash value as per some specific algorithm.

uint8_t cal_hash(uint64_t _in_data) {
    uint8_t hash;
    // algorithm
    // bit at hash[0] = XOR of some specific bits in _in_data
    // repeat above statement for other indexed bits of hash 
    return hash;
}

I want to know what could be the most efficient way to access and set corresponding bits in an integer datatype. I have already tried things like

(((x) & (1<<(n)))?1:0)

to determine if a bit is 1 or 0 at any index. Anything better than this ?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I think this is a speed vs. memory type question. (Updated with MrSmith42s suggestion):

If you really want speed I would define a mask for each bit a compare that. Perhaps something like:

const uint8_t BitMask[] = { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 };

/* Find out if LSB is set */
if( hash & BitMask[0] ) { ... }

The problem with shifts is that it uses an instruction per shift whereas a fixed mask will only have a single memory acces before the comparison.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...