Computer Science, asked by 181360083, 21 days ago

Complete the following program to shift arithmetic right a 32 bit number by shifting one byte at
a time.

Answers

Answered by dami897
0

Answer:

d the result with "32 - b" ones (from the right) to clear "b" left bits in case "shr" fail me and did arithmetic shift instead (no example shows this, but just to make sure). Then the arithmetic shift:

Result := (a shr b) and ((1 shl (32-b))-1);

end;

// Arithmetic shift right with unsigned integers

function sraC(a,b:Cardinal):Cardinal;

begin

Result := (a shr b) or (( 0-((a shr 31) and 1)) shl (32-b));

end;

Test it:

Writeln('E) ', sraI(-1,1) );

Writeln('F) ', srlI(-1,1) );

Writeln('G) ', sraC($FFFFFFFF,1) );

Writeln('H) ', srlC($FFFFFFFF,1) );

And got perfect results:

E) -1

:

program bug;

correct

end.

Then I was curios, is this bug also present in C++? I wrote a port to C++ and use (Borland!) bcc32.exe to compile it.

Results:

0) -1

1) 2147483647

2) -1

3) -1

4) 2147483647

5) 2147483647

6) -1

7) 2147483647

8) -1

9) 2147483647

A) -1

B) 2147483647

C) -1

D) 2147483647

E) -1

F) 2147483647

G) 4294967295

H) 2147483647

K) -1

L) 2147483647

M) 4294967295

N) 2147483647

Everything is OK. Here is C++ version, in case someone also wants to look:

#include <iostream>

using namespace std;

// Simple shift right with signed integers

int shrI(int a, int b){

return a >> b;

}

// Simple shift right with unsigned integers

unsigned int shrC(unsigned int a, unsigned int b){

return a >> b;

}

// Logical shift right with signed integers

int srlI(int a, int b){

return (a >> b) & ((1 << (32-b))-1);

}

// Arithmetic shift right with signed integers

int sraI(int a, int b){

return (a >> b) | (( 0-((a >> 31) & 1)) << (32-b));

}

// Logical shift right with unsigned integers

unsigned int srlC(unsigned int a, unsigned int b){

return (a >> b) & ((1 << (32-b))-1);

}

// Arithmetic shift right with unsigned integers

unsigned int sraC(unsigned int a, unsigned int b){

return (a >> b) | (( 0-((a >> 31) & 1)) << (32-b));

}

int I;

unsigned int C;

int main(){

I = -1;

C = 0xFFFFFFFF;

cout<<"0) "<<( -1 >> 1 )<<endl;

cout<<"1) "<<( 0xFFFFFFFF >> 1 )<<endl;

// 0) -1           - correct

// 1) 2147483647   - correct

cout<<"2) "<<( ((int)(-1)) >> 1 )<<endl;

cout<<"3) "<<( ((int)(0xFFFFFFFF)) >> 1 )<<endl;

// 2) -1           - correct

// 3) -1           - correct

cout<<"4) "<<( ((unsigned int)(-1)) >> 1 )<<endl;

cout<<"5) "<<( ((unsigned int)(0xFFFFFFFF)) >> 1 )<<endl;

// 4) 2147483647   - correct

// 5) 2147483647   - correct

cout<<"6) "<<( I >> 1 )<<endl;

cout<<"7) "<<( C >> 1 )<<endl;

// 6) -1           - correct

// 7) 2147483647   - correct

cout<<"8) "<<( ((int)(I)) >> 1 )<<endl;

cout<<"9) "<<( ((unsigned int)(I)) >> 1 )<<endl;

// 8) -1           - correct

// 9) 2147483647   - correct

cout<<"A) "<<( ((int)(C)) >> 1 )<<endl;

cout<<"B) "<<( ((unsigned int)(C)) >> 1 )<<endl;

// A) -1           - correct

// B) 2147483647   - correct

cout<<"C) "<<( shrI(-1,1) )<<endl;

cout<<"D) "<<( shrC(0xFFFFFFFF,1) )<<endl;

// C) -1           - correct

// D) 2147483647   - correct

cout<<"E) "<<( sraI(-1,1) )<<endl;

cout<<"F) "<<( srlI(-1,1) )<<endl;

// E) -1           - correct

// F) 2147483647   - correct

cout<<"G) "<<( sraC(0xFFFFFFFF,1) )<<endl;

cout<<"H) "<<( srlC(0xFFFFFFFF,1) )<<endl;

// G) 4294967295   - correct

// H) 2147483647   - correct

cout<<"K) "<<( sraI(I,1) )<<endl;

cout<<"L) "<<( srlI(I,1) )<<endl;

// K) -1           - correct

// L) 2147483647   - correct

cout<<"M) "<<( sraC(C,1) )<<endl;

cout<<"N) "<<( srlC(C,1) )<<endl;

// M) 4294967295   - correct

// N) 2147483647   - correct

}

Similar questions