hotti: Bitoperatoren und Unsigned Integer

Beitrag lesen

hi,

hmm ... strict unsigned habe ich noch nicht gesehen, aber ich glaube ein

var num = ...;
(num << 0) // cast

nicht glauben, sondern machen ;)

erzeugt eine 32 Bit Zahl. Kenne aber die Specs nicht genau, hab's nur hier und da mal gesehen.

_('mesg').innerHTML = 0xFFFFffff << 0; // -1

Das ist also völlig unbrauchbar, was da ausgegeben wird. Das liegt, wie 1UnitedPower schrieb, an der inneren Verarbeitung der Bytes und die ist, weil 'float 64 bit': eben nicht auf einen uint32 ausgerichtet.

Mit den neuen Features (MDN, Moz, FF), sprich über ein DataView, erfolgt die Integer-Operation direkt in einem 32-Bit-Puffer:

  
var buffer = new ArrayBuffer(4); // 4 Bytes  
var dv = new DataView(buffer);  
dv.setUint32(0, 0xFFFFffff << 0);  
var u32 = dv.getUint32(0); // Big Endian  
_('mesg').innerHTML = u32; // 4294967295  

was denn auch das erwartete Ergebnis liefert. Mir ist diese Lösung sofort in den Sinn gekommen, nachdem ich JürgenB's POST gelesen habe. Was Berechnungen zu IP-Adressen v4 betrifft, da habe ich sehr viele JS-Lösungen gesehen (z.B. zur Funktion inet_aton()), wo umständlich über einen float gerechnet und dann auch noch gerundet wird.

Das ist in etwa so, als würdest Du bei einer Wurzel aus vier einen Bruch bekommen, der zielgerichtet gerundet werden muss, damit ungefähr zwei rauskommt ;)

Freilich hinkt der Vergleich, aber was das Rechnen mit Uint32 und IPv4 betrift, da werden tatsächlich nur ein paar Bits hin und her geschoben. So habe ich Small Library for IPv4 als eine kleine Library gestern abend mal vervollständigt.

Viele Grüße.