Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #228549

Re: portable way to get highest bit set?

From Tim Rentsch <tr.17687@z991.linuxsc.com>
Newsgroups comp.lang.c
Subject Re: portable way to get highest bit set?
Date 2023-10-11 10:34 -0700
Organization A noiseless patient Spider
Message-ID <86h6mxawqq.fsf@linuxsc.com> (permalink)
References <ug5gvh$1jkar$3@dont-email.me> <20231011102714.44a870af4dfe68f756974953@g{oogle}mail.com> <ug6huc$1rvp1$1@dont-email.me>

Show all headers | View raw


candycanearter07 <no@thanks.net> writes:

> On 10/11/23 02:27, Anton Shepelev wrote:
>
>> candycanearter07:
>>
>>> What is the best/most portable way to get the highest bit
>>> set?
>>>
>>> ie. 011010001
>>> to  010000000
>>
>> What is your best attempt, even if unsuccessful?
>
> int out;
> for(out = 0x100000000; out;  out >> 1)
>     if(out & input) break;
>
> I'm trying to find something size independent, though.
> Or at least able to be swapped out with a #define

I've coded up a dozen[*] different solutions.  Here is my current
favorite[**]:

    typedef union {
        long double d;
        struct { unsigned long long s; unsigned e:15;} b;
    } X;

    unsigned long long
    high_bit_set( unsigned long long u ){
        return  1ULL << (X){ .d = u }.b.e - 16383  & u;
    }


This answer has these nice properties:

   * Single line function body
   * No looping or testing
   * Large domain of inputs supported
   * Widely portable
   * Very few cases with undefined behavior
   * Forms an excellent basis for several interview questions
   * Sure to launch a torrent of followups on its pros and cons

(I'm resisting the temptation to make an off-topic remark
regarding the number of properties.)


P.S. This response is meant to be more entertaining than
useful.  I do hope it helps broaden your thinking in
searching for an answer.


[*] that might be a baker's dozen, due to off-by-one error

[**] for some values of "favorite"

Back to comp.lang.c | Previous | Next | Find similar


Thread

Re: portable way to get highest bit set? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2023-10-11 10:34 -0700

csiph-web