Perl shift bit problem

I have problem when try to shift bit for a negative number with Perl. For example:

printf("%d", (-10) >> 2);

This method print: 1073741821

With same condition, when I try to do it with Javascript:

document.write('test: ' + (-10 >> 2) + '<br>');

The output is -3

I would like to understand the different between Perl and Javascripts. Does Perl have problem with shifting bit for a negative number?

Thank you very much.

Answers


Perl uses unsigned binary right shift. If Perl runs on a 32-bit architecture, you get the following:

-10 == -0xa == 0xfffffff6
0xfffffff6 >> 2 == 0x3ffffffd == 1073741821

Unsigned binary right shift means that the highest (rigtmost) bits of the result become 0.

JavaScript uses sign-extending binary right shift. JavaScript shifts always treat both the input and the output as 32 bit integers. So you get:

-10 == -0xa == 0xfffffff6
-3 == -0x3 == 0xfffffffd
0xfffffff6 >> 2 == 0xfffffffd == -3

Sign-extending binary right shift means that the highest (rigtmost) bits of the result get copied from the highest bit of the original value.

As Tim Henigan said in his answer, it's possible to get sign-extending binary right shift from Perl, by specifying use integer;. Example:

{ use integer;
  printf "%d 0x%x\n", (-10) >> 2, (-10) >> 2;  #: -3 0xfffffffd
}
printf "%d 0x%x\n", (-10) >> 2, (-10) >> 2;  #: 1073741821 0x3ffffffd

Need Your Help

What would be the best way to get the travel distance (walking, driving) between two points using Android Maps API V2?

android api maps

There is the Location.distanceBetween method, but that's just for direct line. I have also looked into The Google Distance Matrix API, but that seems rather involved although it would give me the

Configuring Knockout validation in Durandal / SPA application

knockout.js requirejs single-page-application durandal knockout-validation

I am not able to get knockout.validation up and running with durandal. knockout itself is working fine. If anyone got this straight I would be thankful for posting the configuration.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.