Alla oleva bittioperaattoria hyödyntävä koodi vähentää 32 pienen kirjaimen biteistä sammuttamalla binäärisen AND-operaattorin kuudennen bitin 1111 1111 1101 1111 jonon avulla joka on 65503 kymppijärjestelmässä.
Minulle jää epäselväksi, miksi tämä toimii aina. Mikä takaa sen että alkuperäisessä charissa kyseinen merkki on päällä ja että sen siten voi sammuttaa? Jos alkuperäisen charin kuudes merkki on nolla, vähentääkö bittioperaatio AND silloinkin ko. lukua, kun toisena operandina on 65503? MEli mitä minä ymmärrän tässä väärin?
//Isot kirjaimet
class Isot
{
public static void main(String[] args)
{
char ch;
for(int i=0; i
Minulle jää epäselväksi, miksi tämä toimii aina. Mikä takaa sen että alkuperäisessä charissa kyseinen merkki on päällä ja että sen siten voi sammuttaa? Jos alkuperäisen charin kuudes merkki on nolla, vähentääkö bittioperaatio AND silloinkin ko. lukua, kun toisena operandina on 65503? MEli mitä minä ymmärrän tässä väärin?
//Isot kirjaimet
class Isot
{
public static void main(String[] args)
{
char ch;
for(int i=0; i
Vastaukset 2
Vanhimmat
koska AND muuttaa tuloksen nollaksi, kun jompi kumpi on nolla. Jos me nollalla "ändätään", niin tulos on nolla.
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Jos joku bitti halutaan ykköseksi, niin sitten "oorataan" ykkösellä, koska silloinhan ainakin toinen on aina 1 ja tulos silloin 1.
Kyseinen operaatio sammuttaa siis sen bitti numero viitosen. Jos bitti ei ole päällä, niin tällöin kyseisellä AND operaatiolla ei ole vaikutusta. Alla on esimerkki koodi joka havainnollistaa kyseistä asiaa.
Koodisi toimii koska ASCII merkistön kirjaimia ei ole numeroitu/koodattu satunnaisesti, vaan merkistön koodaamisessa on otettu huomioon myös helppokäyttöisyys, (eli kun muutat yhtä bittiä, saat kirjaimesta ison tai pienen). Tulee kuitenkin muistaa että Javassa voi käyttää Unicode merkistöä, jolloin koodisi ei välttämättä toimi. Jos esimerkiksi katsot merkistöä väliltä U 0100 - U 01FF, joka on latinalainen (laajennetu-A) (Näet sen Wordin merkistöstä tai http://www.unicode.org/charts/PDF/U0100.pdf linkin kautta), niin tämä merkistö/väli on koodattu puolestaan siten että isolla ja pienillä kirjaimella on yhden numeron ( /-1) ero (jolloin bitti numero nollaa muuttamalla saa kirjaimen käännettyä isoksi tai pieneksi).
Tuota tapaa ei kannata käyttää jos ei tiedä missä ja miksi se toimii, vaan silloin kannattaa käyttää Character.toUpperCase() ja Character.toLowerCase() metodeita.
--- ESIMERKKI ALKAA ---
public class Esimerkki {
public static void main(String[] args)
{
int mask = ~(1 -36; i--)
System.out.println(i " & mask = " (i & mask));
}
}
--- ESIMERKKI LOPPUU