Jump to page: 1 2
Thread overview
signed nibble
Jan 07, 2019
Michelle Long
Jan 07, 2019
Patrick Schluter
Jan 07, 2019
Adam D. Ruppe
Jan 07, 2019
Patrick Schluter
Jan 07, 2019
H. S. Teoh
Jan 07, 2019
Patrick Schluter
Jan 07, 2019
H. S. Teoh
Jan 07, 2019
Patrick Schluter
Jan 07, 2019
H. S. Teoh
Jan 08, 2019
Patrick Schluter
Jan 08, 2019
Patrick Schluter
Jan 07, 2019
H. S. Teoh
January 07, 2019
Is there any direct way to convert a signed nibble in to a signed byte with the same absolute value? Obviously I can do some bit comparisons but just curious if there is a very quick way.


January 07, 2019
On Monday, 7 January 2019 at 17:23:19 UTC, Michelle Long wrote:
> Is there any direct way to convert a signed nibble in to a signed byte with the same absolute value? Obviously I can do some bit comparisons but just curious if there is a very quick way.

byte b = nibble | ((nibble & 0x40)?0xF0:0);
January 07, 2019
On Monday, 7 January 2019 at 18:42:13 UTC, Patrick Schluter wrote:
> byte b = nibble | ((nibble & 0x40)?0xF0:0);

don't you mean & 0x80 ?
January 07, 2019
On Monday, 7 January 2019 at 18:47:04 UTC, Adam D. Ruppe wrote:
> On Monday, 7 January 2019 at 18:42:13 UTC, Patrick Schluter wrote:
>> byte b = nibble | ((nibble & 0x40)?0xF0:0);
>
> don't you mean & 0x80 ?

He asked for signed nybble. So mine is wrong and yours also :-)

It's obviously 0x08 for the highest bit of the low nybble.

byte b = nibble | ((nibble & 0x08)?0xF0:0);
January 07, 2019
On Mon, Jan 07, 2019 at 05:23:19PM +0000, Michelle Long via Digitalmars-d-learn wrote:
> Is there any direct way to convert a signed nibble in to a signed byte with the same absolute value? Obviously I can do some bit comparisons but just curious if there is a very quick way.

Assuming you have the nibble stored in the lower bits of a ubyte:

	import std.stdio;
	byte nibSgnExt(ubyte nib)
	{
		return cast(byte)(nib << 4) >> 4;
	}
	void main() {
		writefln("%02X", nibSgnExt(0x0F));
		writefln("%02X", nibSgnExt(0x07));
	}


T

-- 
If it breaks, you get to keep both pieces. -- Software disclaimer notice
January 07, 2019
On Mon, Jan 07, 2019 at 06:42:13PM +0000, Patrick Schluter via Digitalmars-d-learn wrote:
> On Monday, 7 January 2019 at 17:23:19 UTC, Michelle Long wrote:
> > Is there any direct way to convert a signed nibble in to a signed byte with the same absolute value? Obviously I can do some bit comparisons but just curious if there is a very quick way.
> 
> byte b = nibble | ((nibble & 0x40)?0xF0:0);

This is equivalent to doing a bit comparison (implied by the ? operator).  You can do it without a branch:

	cast(byte)(nibble << 4) >> 4

will use the natural sign extension of a (signed) byte to "stretch" the upper bit.  It just takes 2-3 CPU instructions.


T

-- 
Written on the window of a clothing store: No shirt, no shoes, no service.
January 07, 2019
On Monday, 7 January 2019 at 18:56:17 UTC, H. S. Teoh wrote:
> On Mon, Jan 07, 2019 at 06:42:13PM +0000, Patrick Schluter via Digitalmars-d-learn wrote:
>> On Monday, 7 January 2019 at 17:23:19 UTC, Michelle Long wrote:
>> > Is there any direct way to convert a signed nibble in to a signed byte with the same absolute value? Obviously I can do some bit comparisons but just curious if there is a very quick way.
>> 
>> byte b = nibble | ((nibble & 0x40)?0xF0:0);
>
> This is equivalent to doing a bit comparison (implied by the ? operator).  You can do it without a branch:
>
> 	cast(byte)(nibble << 4) >> 4
>
> will use the natural sign extension of a (signed) byte to "stretch" the upper bit.  It just takes 2-3 CPU instructions.
>

Yeah, my bit-fiddle-fu goes back to pre-barrel-shifter days. Up to 32 bit processors, shifting was more expensive than branching.

January 07, 2019
On Mon, Jan 07, 2019 at 08:06:17PM +0000, Patrick Schluter via Digitalmars-d-learn wrote:
> On Monday, 7 January 2019 at 18:56:17 UTC, H. S. Teoh wrote:
> > On Mon, Jan 07, 2019 at 06:42:13PM +0000, Patrick Schluter via Digitalmars-d-learn wrote:
[...]
> > > byte b = nibble | ((nibble & 0x40)?0xF0:0);
> > 
> > This is equivalent to doing a bit comparison (implied by the ? operator).  You can do it without a branch:
> > 
> > 	cast(byte)(nibble << 4) >> 4
> > 
> > will use the natural sign extension of a (signed) byte to "stretch" the upper bit.  It just takes 2-3 CPU instructions.
> > 
> 
> Yeah, my bit-fiddle-fu goes back to pre-barrel-shifter days. Up to 32 bit processors, shifting was more expensive than branching.

Really?  Haha, never knew that, even though I date all the way back to writing assembly on 8-bit processors. :-D


T

-- 
One reason that few people are aware there are programs running the internet is that they never crash in any significant way: the free software underlying the internet is reliable to the point of invisibility. -- Glyn Moody, from the article "Giving it all away"
January 07, 2019
On Monday, 7 January 2019 at 20:28:21 UTC, H. S. Teoh wrote:
> On Mon, Jan 07, 2019 at 08:06:17PM +0000, Patrick Schluter via Digitalmars-d-learn wrote:
>> On Monday, 7 January 2019 at 18:56:17 UTC, H. S. Teoh wrote:
>> > On Mon, Jan 07, 2019 at 06:42:13PM +0000, Patrick Schluter via Digitalmars-d-learn wrote:
> [...]
>> > > byte b = nibble | ((nibble & 0x40)?0xF0:0);
>> > 
>> > This is equivalent to doing a bit comparison (implied by the ? operator).  You can do it without a branch:
>> > 
>> > 	cast(byte)(nibble << 4) >> 4
>> > 
>> > will use the natural sign extension of a (signed) byte to "stretch" the upper bit.  It just takes 2-3 CPU instructions.
>> > 
>> 
>> Yeah, my bit-fiddle-fu goes back to pre-barrel-shifter days. Up to 32 bit processors, shifting was more expensive than branching.
>
> Really?  Haha, never knew that, even though I date all the way back to writing assembly on 8-bit processors. :-D
>
Most of my career was programming for 80186. Shifting by one was 2 cycles in register and 15 in memory. Shifting by 4, 9 cycles for regs/21 for mem. And 80186 was a fast shifter compared to 8088/86 or 68000 (8+2n cycles).

January 07, 2019
On Mon, Jan 07, 2019 at 08:41:32PM +0000, Patrick Schluter via Digitalmars-d-learn wrote:
> On Monday, 7 January 2019 at 20:28:21 UTC, H. S. Teoh wrote:
> > On Mon, Jan 07, 2019 at 08:06:17PM +0000, Patrick Schluter via Digitalmars-d-learn wrote:
[...]
> > > Up to 32 bit processors, shifting was more expensive than branching.
> > 
> > Really?  Haha, never knew that, even though I date all the way back to writing assembly on 8-bit processors. :-D
> > 
> Most of my career was programming for 80186. Shifting by one was 2 cycles in register and 15 in memory. Shifting by 4, 9 cycles for regs/21 for mem. And 80186 was a fast shifter compared to 8088/86 or 68000 (8+2n cycles).

I used to hack 6502 assembly code.  During the PC revolution I wrote an entire application in 8088 assembly.  Used to know many of the opcodes and cycle counts by heart like you do, but it's all but a faint memory now.


T

-- 
Right now I'm having amnesia and deja vu at the same time. I think I've forgotten this before.
« First   ‹ Prev
1 2