For shift operators manipulating positive numbers we can use the short-cut formula,

For example:

for signed right shift: x >> 3, can be solved using the formula x * (2 raised to 3)

for signed left shift: x << 3, can be solved using the formula x / (2 raised to 3)

Is there a short-cut formula to determine the following:

a. unsigned right shift (>>> ?

b. signed right or left shift manipulating negative numbers?

i.e. -5 >> 3 or -5 << 3 or -5 >> -3 or -5 << -3

Thanks in advance!

"If you fail to plan, you plan to fail."<br /> <br />Chad<br />SCJP 1.4<br />SCWCD 1.4<br />SCBCD 1.3<br />SCDJWS (next)

Originally posted by Chard Rex:

a. unsigned right shift (>>> ?

unsigned right shift operator divides the left hand operand to 2 to the power of right hand operand( Only when the left hand operand is positive value)

b. signed right or left shift manipulating negative numbers?

i.e. -5 >> 3 or -5 << 3 or -5 >> -3 or -5 << -3

signed left always multiplies the left hand operand by 2 to the power of right hand operand.

signed right ( >>) divides the left hand operand by 2 to the power of right hand operand [except -1 >> 1 = -1]

Manivannan

Thanks for your reply.

I'm just with this..

public class ShiftOp{

public static void main(String[] args){

System.out.println(-6 >> -1);

System.out.println(-6 >> -2);

System.out.println(-6 >> -3);

System.out.println(-6 >> -4);

System.out.println(-6 >> -5);

}

}

The output for this program are all -1.

How do we do this using the short-cut formula?

"If you fail to plan, you plan to fail."<br /> <br />Chad<br />SCJP 1.4<br />SCWCD 1.4<br />SCBCD 1.3<br />SCDJWS (next)

Originally posted by Chard Rex:

The output for this program are all -1.

How do we do this using the short-cut formula?

hi, dont know the reason for this output. May be this also a short-cut?

Manivannan

public class ShiftOp{

public static void main(String[] args){

System.out.println(-6 >> -1);

System.out.println(-6 >> -2);

System.out.println(-6 >> -3);

System.out.println(-6 >> -4);

System.out.println(-6 >> -5);

}

}

The output for this program are all -1.

How do we do this using the short-cut formula?

Does anyone know the short-cut formula here?

Spot false dilemmas now, ask me how!

(If you're not on the edge, you're taking up too much room.)

I was using jsdk1.4.2_08 for this program and I really get the output of -1 for all.

I just to know how?

Thanks!

"If you fail to plan, you plan to fail."<br /> <br />Chad<br />SCJP 1.4<br />SCWCD 1.4<br />SCBCD 1.3<br />SCDJWS (next)

1) Eventhough you have provided the negative number after the shift operator, it is getting considered as positive(considered as unsigned). In a 8-bit signed integer representation -1 is (1111 1111). In unsigned it becomes 256.

So if we give -6 >> -1 is equal to -6 >> 256(consider the equivalent in 32 bit system i.e. 65536). So in a 8 bit system, if i shift it by 256 times on the right side(with sign preserved), then it becomes -1 (for -ve) and 0(for +ve).

So the formula may be written like this.

(In a 32 bit representation)

x >> y = (x / 2^y) (if y < 32)

= 0 (if x is +ve and y >=32 or y<0)

= -1 (if x is -ve and y>=32 or y<0)

the point to be remembered is that y will be considered always positive. So any negative number in signed system will become a positive number on the higher end.

I haven't checked my observation with programs. Please inform me, if you find some mistakes.

Thanks,

Gokul.

For int numbers, value of the mask is 0x1f (11111) (so the shift opertaion is always in a range 0-31)

a >> b == a >> (b & 0x1f)

x >> y = (x / 2^y) (if y < 32)

= 0 (if x is +ve and y >=32 or y<0)

= -1 (if x is -ve and y>=32 or y<0)

That's not true :

For example

x >> Integer.MIN_VALUE = x

(Integer.MIN_VALUE =-2147483648 = -2^32)

cause Integer.MIN_VALUE & 0x1f = 0

Regards,<br />Seb<br /> <br />SCJP 1.4

Consider Paul's rocket mass heater. |