Posts: 1,956
Threads: 65
Joined: Jun 2003
Using only QB instructions, no assembler, perform the same function that a "rol" does in assembler.
For this exercise, take a given 16 bit value and do a rotate left 2 bits.
*****
Posts: 1,845
Threads: 44
Joined: Aug 2002
Could you please explain what ROL does... I've tried some explanations on the web but they're all too fuzzy. I believe it's not the same as doing shl?
Posts: 320
Threads: 9
Joined: Dec 2004
It's the same as SHL, but the bits that are shunted off of the left-hand-side and replaced onto the right-hand-side.
It's basically:
Code:
int rol(int original, int shiftBy)
{
return (original << shiftBy) | (original >> (16 - shiftBy);
}
img]http://www.cdsoft.co.uk/misc/shiftlynx.png[/img]
Posts: 1,956
Threads: 65
Joined: Jun 2003
Here's an example of a rotate left 2 bits.
If the original variable contains:
0111000111000111
rotating it left 2 bits, would change the variable to:
1100011100011101
*****
Posts: 358
Threads: 15
Joined: May 2003
I believe the following will rotate QB signed 16-bit integers 2 to the left. Note: this would be simpler if qb had unsigned data types.
Code:
DEFINT A-Z
CLS
DO
INPUT "gimme a number"; a
PRINT a; " (dec) == "; HEX$(a); " (hex)"
SignBit = a < 0 ' true if 16th bit is on
'PRINT SignBit
nextBit = ((a AND &H4000) = &H4000) ' true if 15th bit is on
'PRINT nextBit
newSignBit = ((a AND &H2000) = &H2000) ' true if 14th bit is on
'PRINT newSignBit
a = a AND &H1FFF '&H1fff == 0001 1111 1111 1111...clear the bits that will fall off before shifting to prevent overflow errors
a = a * 4 ' shift left 2 bits
a = a + (-2 * SignBit) 'add bit to 2's place
a = a + (-1 * nextBit) 'add bit to 1's place
IF newSignBit THEN a = a OR &H8000 'add sign if needed
PRINT "your number rotated left 2 bits is"
PRINT a; " (dec) == "; HEX$(a); " (hex)"
LOOP
Not the most elegant solution, but...
Posts: 1,956
Threads: 65
Joined: Jun 2003
Mango,
Your solution may not be the most elegant, but it addresses all the salient points of the problem.
Give me a chance to do some testing of it, and let you know how it goes.
*****
Posts: 1,956
Threads: 65
Joined: Jun 2003
Nice job, Mango, your solution works perfectly.
I tested it with a little program from 0 to 32768, verifying the results against my own solution, and in so doing found a bug in mine. :oops:
The big difference between yours and mine is that I did all the work using LONG integers. This enabled me not to have any IF statement.
However, a careful look at yours shows a very clever setup of bitmasks for Signbit and newbit, which in retrospect makes it an elegant solution after all, plus it works!
Congratulations, you are the winner so far.
*****
Posts: 58
Threads: 6
Joined: Feb 2005
x=x*4
same as x <<= 2
-neuro
ignatures suck
Posts: 1,956
Threads: 65
Joined: Jun 2003
Quote:x=x*4
same as x <<= 2
x=x*4
is the same as a shift left of 2 bits.
The original left 2 bits get lost, plus if the original leftmost bit was a 1, you'll get an overflow.
The challenge is to ROTATE the 2 leftmost bits into the 2 rightmost bit positions of the result. Please see the example.
I don't know what you mean by:
x <<= 2
What language is this in?
*****
Posts: 320
Threads: 9
Joined: Dec 2004
Quote:I don't know what you mean by:
x <<= 2
What language is this in?
*****
C/C++/Java/Perl/PHP/probably others.
img]http://www.cdsoft.co.uk/misc/shiftlynx.png[/img]