Die moet ik even kwijt: Ik vind java de meest inconsistente waardeloze taal die op deze aarbol groot is geworden, en wel om het volgende:
Als je eens lekker wilt bitshiften in Java, dat heb je meteen al een groot scala aan problemen waar je tegenaan loopt. Deze problemen lijken verreweg van logisch. Maar misschien ziet iemand een rationele verklaring in de volgende feiten:
De ellende begint al, als je een unsigned integer type wilt, die bestaan simpelweg niet!. En ja, ik weet wel dat Java een OO taal is. Nou maakt het dan compleet OO en niet een beetje, en als je het een beetje wilt doen. Doe het dan een beetje goed!
Probeer namelijk maar een een Signed type in Java te bitshiften. Ja dat gaat lekker fout. De signed bit shift namelijk gewoon niet mee. Daar gaat de essentie van bitshiften.
Owk ze hebben een oplossing gevonden namelijk de >>> operator. En wat doet deze: Hij kopieerd
de singed bit naar rechts en de rest shift hij gewoon!. Ja handig! Alleen DIT is geen bitshiften. Het hele verschuif idee help je hiermee dus om zeep!
Nou ja hier valt nog wel overheen te komen, en stiekum kent Java toch wel 1 unsigned type: char!. leve de char! Die waan laat je ook wel snel varen. Probeer maar eens van een byte een char te maken. Dan heb je acht bits over, want char is 16 bits en byte is 8 bits. Logischerwijs zou je denken dat je gewoon dit kan doen: mychar = (char)mybyte. En weet je wat Java dan doet?!. Hij vult de most significant bits met 1'nen!!
Om het ff in code samen te vatten treden de volgende singulariteiten op:
Myn conclusie is dat om fatsoenlijk te bitshiften, je genageld bent aan een 16 bits karakter type!. Van alle andere kun je gewoon 1 bit weggooien, als je bitwise wilt manipuleren! Maar niet te praten over de rest van de problemen die je dan krijgt.
Ik hoop dat mijn punt een beetje duidelijker is, dan het bitshiften in Java.
Dit vind ik niet echt logisch. En ik zou ook graag willen weten waarom dit zo werkt. En of er een meer C++ of Delphi(!) manier is om dit een beetje in goede banen te leiden?
Als je eens lekker wilt bitshiften in Java, dat heb je meteen al een groot scala aan problemen waar je tegenaan loopt. Deze problemen lijken verreweg van logisch. Maar misschien ziet iemand een rationele verklaring in de volgende feiten:
De ellende begint al, als je een unsigned integer type wilt, die bestaan simpelweg niet!. En ja, ik weet wel dat Java een OO taal is. Nou maakt het dan compleet OO en niet een beetje, en als je het een beetje wilt doen. Doe het dan een beetje goed!
Probeer namelijk maar een een Signed type in Java te bitshiften. Ja dat gaat lekker fout. De signed bit shift namelijk gewoon niet mee. Daar gaat de essentie van bitshiften.
Owk ze hebben een oplossing gevonden namelijk de >>> operator. En wat doet deze: Hij kopieerd
Nou ja hier valt nog wel overheen te komen, en stiekum kent Java toch wel 1 unsigned type: char!. leve de char! Die waan laat je ook wel snel varen. Probeer maar eens van een byte een char te maken. Dan heb je acht bits over, want char is 16 bits en byte is 8 bits. Logischerwijs zou je denken dat je gewoon dit kan doen: mychar = (char)mybyte. En weet je wat Java dan doet?!. Hij vult de most significant bits met 1'nen!!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| (pseudo) byte type (-128 t/m +128) : 10000011 = -67 11000011 >> 1 = 10100001 (Hij laat de singed bit gewoon staan!! freak!) 11000011 >>> 1 = 11010001 (Ja..nee. dit is logisch shiften! :? ) char type: (0 t/m 65535) byte naar char: mychar = (char) 01000100 En wat is mychar nu: 1111111101000100 Lekker hoor, alles met 1nen aanvullen! Dus om dit goed te kunnen doen moet je dit doen: mychar = (char) (01000100 << 8) mychar = mychar >> 8 nu staat wel de gewenste waarde in mychar! |
Myn conclusie is dat om fatsoenlijk te bitshiften, je genageld bent aan een 16 bits karakter type!. Van alle andere kun je gewoon 1 bit weggooien, als je bitwise wilt manipuleren! Maar niet te praten over de rest van de problemen die je dan krijgt.
Ik hoop dat mijn punt een beetje duidelijker is, dan het bitshiften in Java.
Dit vind ik niet echt logisch. En ik zou ook graag willen weten waarom dit zo werkt. En of er een meer C++ of Delphi(!) manier is om dit een beetje in goede banen te leiden?