Question about Hex => Signed Int

Hello,
Is there a ruby function to convert the following hexadecimal numbers
into the corresponding signed integers or will i need to write something
to do the conversion? Sorry if this question is stupid but i'm pretty
new to all this.

0xFF467A7B => -12158341
0x38CFEF => 3723247

Thanks

···

--
Posted via http://www.ruby-forum.com/.

Hello,
Is there a ruby function to convert the following hexadecimal numbers
into the corresponding signed integers or will i need to write something
to do the conversion? Sorry if this question is stupid but i'm pretty
new to all this.

0xFF467A7B => -12158341
0x38CFEF => 3723247

The tricky part is dealing with the twos compliment notation but String#to_i will do the hex/decimal conversion:

>> "0xFF467A7B".to_i(16) - 0x100000000
=> -12158341

>> "0x38CFEF".to_i(16)
=> 3723247

Gary Wright

···

On Jan 9, 2008, at 2:48 PM, Tim Conner wrote:

Gary Wright wrote:

The tricky part is dealing with the twos compliment notation but
String#to_i will do the hex/decimal conversion:

>> "0xFF467A7B".to_i(16) - 0x100000000
=> -12158341

>> "0x38CFEF".to_i(16)
=> 3723247

Gary Wright

Thanks for that. Is there a ruby function which I can pass a hex number
and it works out if it is +/- and then returns the correct decimal
value?

···

--
Posted via http://www.ruby-forum.com/\.

Tim Conner wrote:

Gary Wright wrote:

The tricky part is dealing with the twos compliment notation but
String#to_i will do the hex/decimal conversion:

>> "0xFF467A7B".to_i(16) - 0x100000000
=> -12158341

>> "0x38CFEF".to_i(16)
=> 3723247

Gary Wright

Thanks for that. Is there a ruby function which I can pass a hex number and it works out if it is +/- and then returns the correct decimal value?

Convert to unsigned first, like above, then do something like this:

     length = 32 # in bits; you have to choose this

     mid = 2**(length-1)
     max_unsigned = 2**length
     to_signed = proc {|n| (n>=mid) ? n - max_unsigned : n}

     p to_signed["0xFF467A7B".to_i(16)]
     p to_signed["0x38CFEF".to_i(16)]

See http://en.wikipedia.org/wiki/Twos_complement\.

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Thanks a lot, that works a treat.

···

--
Posted via http://www.ruby-forum.com/.

Why go through all the trouble to make this a proc?

--Ken

···

On Thu, 10 Jan 2008 13:19:46 -0500, Joel VanderWerf wrote:

Tim Conner wrote:

Thanks for that. Is there a ruby function which I can pass a hex
number and it works out if it is +/- and then returns the correct
decimal value?

Convert to unsigned first, like above, then do something like this:

     length = 32 # in bits; you have to choose this

     mid = 2**(length-1)
     max_unsigned = 2**length
     to_signed = proc {|n| (n>=mid) ? n - max_unsigned : n}

     p to_signed["0xFF467A7B".to_i(16)]
     p to_signed["0x38CFEF".to_i(16)]

See http://en.wikipedia.org/wiki/Twos_complement\.

--
Ken (Chanoch) Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu/~kbloom1/

Ken Bloom wrote:

···

On Thu, 10 Jan 2008 13:19:46 -0500, Joel VanderWerf wrote:

Tim Conner wrote:

Thanks for that. Is there a ruby function which I can pass a hex
number and it works out if it is +/- and then returns the correct
decimal value?

Convert to unsigned first, like above, then do something like this:

     length = 32 # in bits; you have to choose this

     mid = 2**(length-1)
     max_unsigned = 2**length
     to_signed = proc {|n| (n>=mid) ? n - max_unsigned : n}

     p to_signed["0xFF467A7B".to_i(16)]
     p to_signed["0x38CFEF".to_i(16)]

See http://en.wikipedia.org/wiki/Twos_complement\.

Why go through all the trouble to make this a proc?

Cut and paste from some code that was using #define_method with this proc, and thereby saved performing the exponentiations on each call. That's all.

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407