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,5697899e4423465c X-Google-Attributes: gid103376,public From: eachus@spectre.mitre.org (Robert I. Eachus) Subject: Re: Boolean Representation Date: 1998/09/25 Message-ID: #1/1 X-Deja-AN: 394835093 References: <6udkcj$87j$1@nnrp1.dejanews.com> <6udriu$hfi$1@nnrp1.dejanews.com> <6ue3uh$qjo$1@nnrp1.dejanews.com> Organization: The Mitre Corp., Bedford, MA. Newsgroups: comp.lang.ada Date: 1998-09-25T00:00:00+00:00 List-Id: In article <6ue3uh$qjo$1@nnrp1.dejanews.com> matthew_snyder@my-dejanews.com writes: > The reason for my original question is that I'm trying to decide > the best (most portable) way to convert an UNSIGNED_8 to a record > type which provides access to the individual bits. The record > could either consist of booleans, or it could consist of my own > bit type (is there a predefined BIT type that I'm overlooking?). > Right now my record consists of booleans and I'm performing an > unchecked conversion from UNSIGNED_8 to the record type. The > option of doing a "for RECORD'ADDRESS use SOME_ADDRESS" is not > available in this situation. Is any use of UNCHECKED_CONVERSION > considered "junky coding"? I certainly would not want to have to > do a 'POS on every bit to assure portability. What's the best way > to do this? Hmmm, do you really need the record type, or is access to the bits enough? with Interfaces; package Bit_Manipulation is subtype Index is Integer range 1..8; function Get(X: Interfaces.Unsigned_8; Bit: Integer) return Boolean; procedure Set(X: in out Interfaces.Unsigned_8; Bit: in Integer); procedure Unset(X: in out Interfaces.Unsigned_8; Bit: in Integer); procedure Set(X: in out Interfaces.Unsigned_8; Bit: in Integer; Value: in Boolean); pragma Inline(Get, Set, Unset); end Bit_Manipulation; package body Bit_Manipulation is use Interfaces; Mask: constant array(Index) of Interfaces.Unsigned_8 := (1,2,4,8,16,32,64,128); function Get(X: Interfaces.Unsigned_8; Bit: Integer) return Boolean is begin return (X and Mask(Bit)) /= 0; end Get; procedure Set(X: in out Interfaces.Unsigned_8; Bit: in Integer) is begin X := X or Mask(Bit); end Set; procedure Unset(X: in out Interfaces.Unsigned_8; Bit: in Integer) is begin X := X and not Mask(Bit); end Unset; procedure Set(X: in out Interfaces.Unsigned_8; Bit: in Integer; Value: in Boolean) is begin if Value then Set(X, Bit); else Unset(X, Bit); end if; end Set; end Bit_Manipulation; I haven't checked compilers to see if the resulting code is what you would expect for these operations, but it should come pretty close as long as Bit is static. -- Robert I. Eachus with Standard_Disclaimer; use Standard_Disclaimer; function Message (Text: in Clever_Ideas) return Better_Ideas is...