I'm bitwise shifting integers(optimized algorithms).
The problem is when they switch unsigned/signed representation and the results are wrong.Can anyone explain how to fix this?
Op: What CFlags are you using? Have you tried compiling your code on any type of a SPARC processor to be sure? I ask this because SPARCS use different indian bits, so you might not run into these problems. Or you might get different ones, I'm not sure. As an undergraduate Computer Science Student, I don't get to interact with SPARC processors. In fact, all I get to use is Scheme. I'm posting this from my Schemeing rig as a matter of fact.
Name:
Anonymous2008-12-22 17:10
Obviously OP needs to be using bignums. This is the standard, enterprise-quality, failsafe numerical analysis technique. Such primitive notions as fixed-bit-width numbers have been obsolete for years.
Nevermind i decided to use another version:
it doesn't use any regular shifts,but it get right results every time.
function cshr(value,shift){
var txt=value.toString(2);
var txl=32-txt.length;
switch(txl){
case 1:;var adds='0'+txt;break;
case 2:;var adds='00'+txt;break;
case 3:;var adds='000'+txt;break;
case 4:;var adds='0000'+txt;break;
case 5:;var adds='00000'+txt;break;
case 6:;var adds='000000'+txt;break;
case 7:;var adds='0000000'+txt;break;
case 8:;var adds='00000000'+txt;break;
case 9:;var adds='000000000'+txt;break;
case 10:;var adds='0000000000'+txt;break;
case 11:;var adds='00000000000'+txt;break;
case 12:;var adds='000000000000'+txt;break;
case 13:;var adds='0000000000000'+txt;break;
case 14:;var adds='00000000000000'+txt;break;
case 15:;var adds='000000000000000'+txt;break;
case 16:;var adds='0000000000000000'+txt;break;
case 17:;var adds='00000000000000000'+txt;break;
case 18:;var adds='000000000000000000'+txt;break;
case 19:;var adds='0000000000000000000'+txt;break;
case 20:;var adds='00000000000000000000'+txt;break;
case 21:;var adds='000000000000000000000'+txt;break;
case 22:;var adds='0000000000000000000000'+txt;break;
case 23:;var adds='00000000000000000000000'+txt;break;
case 24:;var adds='000000000000000000000000'+txt;break;
case 25:;var adds='0000000000000000000000000'+txt;break;
case 26:;var adds='00000000000000000000000000'+txt;break;
case 27:;var adds='000000000000000000000000000'+txt;break;
case 28:;var adds='0000000000000000000000000000'+txt;break;
case 29:;var adds='00000000000000000000000000000'+txt;break;
case 30:;var adds='000000000000000000000000000000'+txt;break;
case 31:;var adds='0000000000000000000000000000000'+txt;break;
case 32:;var adds='00000000000000000000000000000000'+txt;break;
default:var adds=txt;break;
}
switch(parseInt(shift)){
case 0:;var shf=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];break;
case 1:;var shf=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0];break;
case 2:;var shf=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1];break;
case 3:;var shf=[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2];break;
case 4:;var shf=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3];break;
case 5:;var shf=[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4];break;
case 6:;var shf=[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5];break;
case 7:;var shf=[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6];break;
case 8:;var shf=[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7];break;
case 9:;var shf=[9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8];break;
case 10:;var shf=[10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9];break;
case 11:;var shf=[11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10];break;
case 12:;var shf=[12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11];break;
case 13:;var shf=[13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12];break;
case 14:;var shf=[14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13];break;
case 15:;var shf=[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14];break;
case 16:;var shf=[16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];break;
case 17:;var shf=[17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];break;
case 18:;var shf=[18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17];break;
case 19:;var shf=[19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18];break;
case 20:;var shf=[20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];break;
case 21:;var shf=[21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];break;
case 22:;var shf=[22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];break;
case 23:;var shf=[23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22];break;
case 24:;var shf=[24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23];break;
case 25:;var shf=[25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];break;
case 26:;var shf=[26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];break;
case 27:;var shf=[27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26];break;
case 28:;var shf=[28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27];break;
case 29:;var shf=[29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28];break;
case 30:;var shf=[30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29];break;
case 31:;var shf=[31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30];break;
default:var shf=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];break;
};
var resar=[];
for(var i=0;i<32;i++){
resar[i]=txt[shf[i]]}
return parseInt(resar.join(""),2)
}
Its not optimized enough;
var resar=[txt[shf[0]],txt[shf[1]],txt[shf[2]],txt[shf[3]],txt[shf[4]],txt[shf[5]],txt[shf[6]],txt[shf[7]],txt[shf[8]],txt[shf[9]],txt[shf[10]],txt[shf[11]],txt[shf[12]],txt[shf[13]],txt[shf[14]],txt[shf[15]],txt[shf[16]],txt[shf[17]],txt[shf[18]],txt[shf[19]],txt[shf[20]],txt[shf[21]],txt[shf[22]],txt[shf[23]],txt[shf[24]],txt[shf[25]],txt[shf[26]],txt[shf[27]],txt[shf[28]],txt[shf[29]],txt[shf[30]],txt[shf[31]]]
unrolls the for loop
//further optimized
function cshr(value,shift,back){
//circular shift,with left shift(back)
var txt=value.toString(2);
var txl=32-txt.length;
switch(txl){
case 1:;var txt='0'+txt;break;
case 2:;var txt='00'+txt;break;
case 3:;var txt='000'+txt;break;
case 4:;var txt='0000'+txt;break;
case 5:;var txt='00000'+txt;break;
case 6:;var txt='000000'+txt;break;
case 7:;var txt='0000000'+txt;break;
case 8:;var txt='00000000'+txt;break;
case 9:;var txt='000000000'+txt;break;
case 10:;var txt='0000000000'+txt;break;
case 11:;var txt='00000000000'+txt;break;
case 12:;var txt='000000000000'+txt;break;
case 13:;var txt='0000000000000'+txt;break;
case 14:;var txt='00000000000000'+txt;break;
case 15:;var txt='000000000000000'+txt;break;
case 16:;var txt='0000000000000000'+txt;break;
case 17:;var txt='00000000000000000'+txt;break;
case 18:;var txt='000000000000000000'+txt;break;
case 19:;var txt='0000000000000000000'+txt;break;
case 20:;var txt='00000000000000000000'+txt;break;
case 21:;var txt='000000000000000000000'+txt;break;
case 22:;var txt='0000000000000000000000'+txt;break;
case 23:;var txt='00000000000000000000000'+txt;break;
case 24:;var txt='000000000000000000000000'+txt;break;
case 25:;var txt='0000000000000000000000000'+txt;break;
case 26:;var txt='00000000000000000000000000'+txt;break;
case 27:;var txt='000000000000000000000000000'+txt;break;
case 28:;var txt='0000000000000000000000000000'+txt;break;
case 29:;var txt='00000000000000000000000000000'+txt;break;
case 30:;var txt='000000000000000000000000000000'+txt;break;
case 31:;var txt='0000000000000000000000000000000'+txt;break;
case 32:;var txt='00000000000000000000000000000000'+txt;break;
default:break;
}
if(back){var sh=32-parseInt(shift)}else{var sh=parseInt(shift)}
switch(sh){
case 0:;var shf=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];break;
case 1:;var shf=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0];break;
case 2:;var shf=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1];break;
case 3:;var shf=[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2];break;
case 4:;var shf=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3];break;
case 5:;var shf=[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4];break;
case 6:;var shf=[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5];break;
case 7:;var shf=[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6];break;
case 8:;var shf=[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7];break;
case 9:;var shf=[9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8];break;
case 10:;var shf=[10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9];break;
case 11:;var shf=[11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10];break;
case 12:;var shf=[12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11];break;
case 13:;var shf=[13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12];break;
case 14:;var shf=[14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13];break;
case 15:;var shf=[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14];break;
case 16:;var shf=[16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];break;
case 17:;var shf=[17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];break;
case 18:;var shf=[18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17];break;
case 19:;var shf=[19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18];break;
case 20:;var shf=[20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];break;
case 21:;var shf=[21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];break;
case 22:;var shf=[22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];break;
case 23:;var shf=[23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22];break;
case 24:;var shf=[24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23];break;
case 25:;var shf=[25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];break;
case 26:;var shf=[26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];break;
case 27:;var shf=[27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26];break;
case 28:;var shf=[28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27];break;
case 29:;var shf=[29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28];break;
case 30:;var shf=[30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29];break;
case 31:;var shf=[31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30];break;
default:var shf=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];break;
};
var resar=[txt[shf[0]],txt[shf[1]],txt[shf[2]],txt[shf[3]],txt[shf[4]],txt[shf[5]],txt[shf[6]],txt[shf[7]],txt[shf[8]],txt[shf[9]],txt[shf[10]],txt[shf[11]],txt[shf[12]],txt[shf[13]],txt[shf[14]],txt[shf[15]],txt[shf[16]],txt[shf[17]],txt[shf[18]],txt[shf[19]],txt[shf[20]],txt[shf[21]],txt[shf[22]],txt[shf[23]],txt[shf[24]],txt[shf[25]],txt[shf[26]],txt[shf[27]],txt[shf[28]],txt[shf[29]],txt[shf[30]],txt[shf[31]]]
return resar;
return parseInt(resar.join(""),2)
}
Name:
Anonymous2008-12-23 13:01
//add this to Ensure ENTERPRISE QUALITY
//otherwise it wouldn't handle negative numbers
if(value<0){value=value+2147483647}
if(value<0){value=value+2147483647}
var txt=value.toString(2);
Name:
Anonymous2009-03-06 12:07
TROLLING saying that seriously read it and it gets better when I come here and ask if they found in the disassembly.