Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Re: bitwise absolute value

Reply
Thread Tools

Re: bitwise absolute value

 
 
Derk Gwen
Guest
Posts: n/a
 
      09-10-2003
# That works, but it assumes 32 bit integers. Is there a
# portable/standard way to do this? Or are ANSI integers

assert(-1==~0); /*twos complement*/

signx = x>>(sizeof x*CHAR_BIT)
absx = (x ^ signx)-signx;

--
Derk Gwen http://derkgwen.250free.com/html/index.html
Death is the worry of the living. The dead, like myself,
only worry about decay and necrophiliacs.
 
Reply With Quote
 
 
 
 
Kevin Easton
Guest
Posts: n/a
 
      09-10-2003
Derk Gwen <(E-Mail Removed)> wrote:
> # That works, but it assumes 32 bit integers. Is there a
> # portable/standard way to do this? Or are ANSI integers
>
> assert(-1==~0); /*twos complement*/
>
> signx = x>>(sizeof x*CHAR_BIT)
> absx = (x ^ signx)-signx;


That makes two assumptions, only one of which your assert() checks (the
other is that >> fills using the sign bit).

- Kevin.

 
Reply With Quote
 
 
 
 
pete
Guest
Posts: n/a
 
      09-10-2003
Kevin Easton wrote:
>
> Derk Gwen <(E-Mail Removed)> wrote:
> > # That works, but it assumes 32 bit integers. Is there a
> > # portable/standard way to do this? Or are ANSI integers
> >
> > assert(-1==~0); /*twos complement*/
> >
> > signx = x>>(sizeof x*CHAR_BIT)
> > absx = (x ^ signx)-signx;

>
> That makes two assumptions,
> only one of which your assert() checks (the
> other is that >> fills using the sign bit).


It's not as good as that.
x>>(sizeof x*CHAR_BIT) is shifted too far, and undefined behavior.
No padding bits is also assumed.

--
pete
 
Reply With Quote
 
Jarno A Wuolijoki
Guest
Posts: n/a
 
      09-10-2003
On Wed, 10 Sep 2003, pete wrote:

> > > assert(-1==~0); /*twos complement*/
> > >
> > > signx = x>>(sizeof x*CHAR_BIT)
> > > absx = (x ^ signx)-signx;

> >
> > That makes two assumptions,
> > only one of which your assert() checks (the
> > other is that >> fills using the sign bit).

>
> It's not as good as that.
> x>>(sizeof x*CHAR_BIT) is shifted too far, and undefined behavior.
> No padding bits is also assumed.


unsigned x_is_neg = (unsigned)x/(1u+-1u/2u);
absx = ((unsigned)x ^ -x_is_neg)+x_is_neg;

 
Reply With Quote
 
Kevin Easton
Guest
Posts: n/a
 
      09-10-2003
pete <(E-Mail Removed)> wrote:
> Kevin Easton wrote:
>>
>> Derk Gwen <(E-Mail Removed)> wrote:
>> > # That works, but it assumes 32 bit integers. Is there a
>> > # portable/standard way to do this? Or are ANSI integers
>> >
>> > assert(-1==~0); /*twos complement*/
>> >
>> > signx = x>>(sizeof x*CHAR_BIT)
>> > absx = (x ^ signx)-signx;

>>
>> That makes two assumptions,
>> only one of which your assert() checks (the
>> other is that >> fills using the sign bit).

>
> It's not as good as that.
> x>>(sizeof x*CHAR_BIT) is shifted too far, and undefined behavior.


True.

> No padding bits is also assumed.


Padding bits are invisible to shifts (x >> 1 is always x / 2 for +ve x,
regardless of padding bits). In general padding bits are only a concern
when type punning is taking place.

- Kevin.

 
Reply With Quote
 
Arthur J. O'Dwyer
Guest
Posts: n/a
 
      09-10-2003

On Wed, 10 Sep 2003, Kevin Easton wrote:
>
> pete <(E-Mail Removed)> wrote:
> > Kevin Easton wrote:
> >>
> >> Derk Gwen <(E-Mail Removed)> wrote:
> >> > # That works, but it assumes 32 bit integers. Is there a
> >> > # portable/standard way to do this? Or are ANSI integers
> >> >
> >> > assert(-1==~0); /*twos complement*/
> >> >
> >> > signx = x>>(sizeof x*CHAR_BIT)
> >> > absx = (x ^ signx)-signx;
> >>
> >> That makes two assumptions,
> >> only one of which your assert() checks (the
> >> other is that >> fills using the sign bit).

> >
> > It's not as good as that.
> > x>>(sizeof x*CHAR_BIT) is shifted too far, and undefined behavior.
> > No padding bits is also assumed.

>
> Padding bits are invisible to shifts (x >> 1 is always x / 2 for +ve x,
> regardless of padding bits). In general padding bits are only a concern
> when type punning is taking place.


Yes, but in this case the number of padding bits affects *how far*
we need to right-shift the value. If there are no padding bits,
then the value of (sizeof x*CHAR_BIT) is correct. If there is one
padding bit per byte, then we really need to shift by
(sizeof x * (CHAR_BIT-1)); if there is one padding bit per integer,
maybe as a parity bit, then we mean (sizeof x * CHAR_BIT - 1); and
so on.

(N869 sections 6.5.7#3, 6.2.6.2#4)

-Arthur
 
Reply With Quote
 
pete
Guest
Posts: n/a
 
      09-11-2003
Arthur J. O'Dwyer wrote:
>
> On Wed, 10 Sep 2003, Kevin Easton wrote:
> >
> > pete <(E-Mail Removed)> wrote:


> > > x>>(sizeof x*CHAR_BIT) is shifted too far, and undefined behavior.


> If there are no padding bits,
> then the value of (sizeof x*CHAR_BIT) is correct.


N869
6.5.7 Bitwise shift operators
[#3]

The integer promotions are performed on each of the
operands. The type of the result is that of the promoted
left operand. If the value of the right operand is negative
or is greater than or

equal to the width of the promoted left operand,
^^^^^

the behavior is undefined.

--
pete
 
Reply With Quote
 
Arthur J. O'Dwyer
Guest
Posts: n/a
 
      09-11-2003

On Thu, 11 Sep 2003, pete wrote:
>
> Arthur J. O'Dwyer wrote:
> > On Wed, 10 Sep 2003, Kevin Easton wrote:
> > > pete <(E-Mail Removed)> wrote:

>
> > > > x>>(sizeof x*CHAR_BIT) is shifted too far, and undefined behavior.

>
> > If there are no padding bits,
> > then the value of (sizeof x*CHAR_BIT) is correct.

>
> N869
> 6.5.7 Bitwise shift operators
> [#3]

[re: sizeof x*CHAR_BIT is undefined behavior]

Oh -- of course. Sorry. Subtract one from each of my examples;
e.g., if there are no padding bits, then (sizeof x*CHAR_BIT)-1 is
correct; if there's one padding bit per byte, then
(sizeof x*(CHAR_BIT-1)-1 is correct; et cetera.

-Arthur

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How does one get an absolute absolute file path? James Byrne Ruby 3 09-14-2010 06:02 PM
Absolute value of signed 32-bit random integer John B. Matthews Java 73 11-09-2009 05:05 PM
A question about taking the absolute value of an integer Chad C Programming 9 01-22-2008 02:52 PM
Possible to set a UserControl's bitwise Enum value in aspx file ? Moe Sisko ASP .Net Web Controls 2 01-07-2008 11:39 PM
bitwise absolute value Christopher Benson-Manica C Programming 34 09-11-2003 10:52 AM



Advertisments