From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,LOTS_OF_MONEY autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,7e15102eb14c0020 X-Google-NewGroupId: yes X-Google-Attributes: gida07f3367d7,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII-7-bit Received: by 10.180.105.2 with SMTP id gi2mr563273wib.4.1348946165061; Sat, 29 Sep 2012 12:16:05 -0700 (PDT) Path: q11ni99823728wiw.1!nntp.google.com!proxad.net!feeder1-2.proxad.net!usenet-fr.net!de-l.enfer-du-nord.net!feeder1.enfer-du-nord.net!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Bill Findlay Newsgroups: comp.lang.ada Subject: Re: highest bit, statically determined Date: Sat, 29 Sep 2012 20:16:01 +0100 Message-ID: References: <50673111$0$9505$9b4e6d93@newsspool1.arcor-online.net> Mime-Version: 1.0 X-Trace: individual.net nJmyan/xbaXtY10gW5iLYAKrvXVQqsbPzWxz84VTgnfG4UlvpAOAdtsXNWboE70h8n Cancel-Lock: sha1:Lo6zscLEV+1ydwnoovPE0OgwwT8= User-Agent: Microsoft-Entourage/12.33.0.120411 Thread-Topic: highest bit, statically determined Thread-Index: Ac2edDlmWZQw/7/nukOgrqFPIITRBgAAqNSP Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Date: 2012-09-29T20:16:01+01:00 List-Id: On 29/09/2012 19:57, in article CC8D0314.1E2CC%yaldnif.w@blueyonder.co.uk, "Bill Findlay" wrote: > On 29/09/2012 18:34, in article > 50673111$0$9505$9b4e6d93@newsspool1.arcor-online.net, "Georg Bauhaus" > wrote: > >> Is there a shorter/better way of having the compiler >> find the highest bit = 1 in a static numeric constant? >> >> If N is such a constant, e.g. Some_Type'Last where >> Some_Type'Size = 8 and its bound are static, then >> >> Highest_Bit_In_Octet : constant := >> Natural'Max >> (8 * Boolean'Pos (N / 2**7 > 0), >> Natural'Max >> (7 * Boolean'Pos (N / 2**6 > 0), >> Natural'Max >> (6 * Boolean'Pos (N / 2**5 > 0), >> Natural'Max >> (5 * Boolean'Pos (N / 2**4 > 0), >> Natural'Max >> (4 * Boolean'Pos (N / 2**3 > 0), >> Natural'Max >> (3 * Boolean'Pos (N / 2**2 > 0), >> Natural'Max >> (2 * Boolean'Pos (N / 2**1 > 0), >> Natural'Max >> (1 * Boolean'Pos (N / 2**0 > 0), 0)))))))); > > In my experience that sort of code, applied in non-static cases, is less > efficient than one would hope, and more obvious code works faster. > > Something like the following can be readily extended to greater operand > widths: > > function first_1_bit (y : octet) > return Natural is > x : octet; > r : Natural; > begin > if y = 0 then return 0; end if; > > if (y / 16) /= 0 then > r := 4; x := y / 16; > else > r := 0; x := y; > end if; > > if (x / 4) /= 0 then > r := r + 2; x := x / 4; > end if; > > if (x / 2) /= 0 then > r := r + 1; > end if; > > return r + 1; > end first_1_bit; > > It looks fairly inline-able, and foldable for a static value of y. I can now confirm that with GNAT GPL 2012 at -O3 it does inline and fold, but I now see that you want the result to be static as well as the operand, and this does not achieve that. -- Bill Findlay with blueyonder.co.uk; use surname & forename;