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.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,e8b01e86b2d0a470 X-Google-Attributes: gid103376,public From: Samuel Mize Subject: Re: how to do bit-wise operation on none modular types? Date: 1999/03/03 Message-ID: <7bjjck$25t7@news1.newsguy.com>#1/1 X-Deja-AN: 450788819 References: <7bj7ti$4i@drn.newsguy.com> Organization: ImagiNet Communications, Ltd. User-Agent: tin/pre-1.4-981002 ("Phobia") (UNIX) (AIX/3-2) Newsgroups: comp.lang.ada Date: 1999-03-03T00:00:00+00:00 List-Id: Bill, If your status is a positive number, Tucker's answer is good. (Of course.) If not -- for instance, if it's a bitmap of status values and the sign bit is used -- you'll have to use unchecked conversion. Make sure the unsigned type and the signed type are the same size, and use an instance of Unchecked_Conversion to convert the signed type to the modular type. Some people prefer to convert to a packed array of booleans if they're working with a boolean bitmap, as they feel it makes the rest of the code clearer. Tucker, Do you get some advantage from the "more direct route" that compensates for it being somewhat less clear? I would expect the type conversion to be a "view conversion" (terminology check) and so not to require a copy, so both code fragments would be equally efficient. Best, Sam Mize Tucker Taft wrote: > bill@nospam wrote: > > : greetings, > > : I have an integer value that is returned from some call (its status). > > : I'd like to take the bit-wise "and" of this value against > : another value (16#FFFF#). (i.e. in C, do: 0xffff & i) > > : Ada does not allow this, as both operands must be modular integer types > : (i.e. range from 0 to some positive value). > > : what can one do? do I need to convert integer value returned from signed > : to unsigned (i.e. modular)? how? > > Presuming the value is positive and less than the modulus of the > modular type, then you can just convert it to the modular type > using the normal conversion operator. E.g.: > > type My_Mod is mod 2**; > > ... My_Mod(I) and 16#ffff# ... > > The other more direct route is: > > ... I mod 16#10000# ... > > A good compiler will use a bit-wise and instruction when computing a "mod" > with a power of 2. > > : cheers, > : Bill. > > -- > -Tucker Taft stt@averstar.com http://www.averstar.com/~stt/ > Technical Director, Distributed IT Solutions (www.averstar.com/tools) > AverStar (formerly Intermetrics, Inc.) Burlington, MA USA -- Samuel Mize -- smize@imagin.net (home email) -- Team Ada Fight Spam: see http://www.cauce.org/ \\\ Smert Spamonam