JavaRush /Java блогу /Random-KY /Javaдагы биттик операциялар

Javaдагы биттик операциялар

Группада жарыяланган
Сиз "согуу" деген сөз менен тааныш болсоңуз керек. Болбосо, анда аны менен таанышалы :) Бит – компьютердеги маалыматтын минималдуу өлчөө бирдиги. Анын аты англисче " binary digit " - "binary number" деген сөздөн келип чыккан. Бит эки сандын бири катары көрсөтүлүшү мүмкүн: 1 же 0. Бирдик жана нөлгө негизделген атайын санауу системасы бар - экorк. Биз математиканын джунглисине кирбейбиз жана Javaдагы каалаган санды анын бинардык формасына айландырууга болорун белгилейбиз. Бул үчүн сиз орогуч класстарды колдонушуңуз керек. Биталдык операциялар - 1Мисалы, бул сан үчүн муну кантип жасоо керек int:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(x));
   }
}
Консолдук чыгаруу:

101010110
1010 10110 (окуу үчүн боштук коштум) бинардык системадагы 342 саны. Биз чындыгында бул санды жеке биттерге - нөлгө жана бирдикке бөлдүк. Алар менен биз биттик деп аталган операцияларды аткара алабыз.
  • ~— биттик «NOT» оператору.

Ал абдан жөнөкөй иштейт: ал биздин сандын ар бир битинен өтүп, анын маанисин тескерисинче өзгөртөт: нөлдөрдү бирге, бирдиктерди нөлгө. Эгерде биз аны 342 саныбызга колдонсок, анда биз мындай алабыз: 101010110 - бинардык системадагы 342 саны 010101001 - ~342 туюнтмасынын натыйжасы Бирок int өзгөрмөсү 4 byte алгандыктан, б.а. 32 бит, чындыгында, өзгөрмөдөгү сан төмөнкүдөй сакталат: 00000000 00000000 00000001 01010110- javaдагы int түрүндөгү өзгөрмөдөгү 342 саны 11111111 11111111 11111110 10101001- javaдагы ~342 туюнтмасынын натыйжасы Келгиле, муну иш жүзүндө жасаганга аракет кылалы:
public class Main {

   public static void main(String[] args) {

       int x = 342;
       System.out.println(Integer.toBinaryString(~x));
   }
}
Консолдук чыгаруу:
11111111111111111111111010101001
  • &- биттик оператор "AND"

Көрүнүп тургандай, ал логикалык "ЖАНА" ( &&) менен абдан окшош жазылган. Оператор &&, эсиңизде болгондой, trueэки операнд тең чын болсо гана кайтарат. Bitwise &да ушундай жол менен иштейт: ал эки санды аз-аздан салыштырат. Бул салыштыруунун натыйжасы үчүнчү сан болуп саналат. Мисалы, 277 жана 432 сандарын алалы: 100010101 - бинардык формадагы 277 саны 110110000 - экorк формадагы 432 саны Андан кийин оператор &жогорку сандын биринчи битин төмөнкү сандын биринчи битине салыштырат. Бул "ЖАНА" оператору болгондуктан, эки бит тең 1ге барабар болгондо гана натыйжа 1ге барабар болот. Калган бардык учурларда жыйынтык 0 болот. 100010101 & 110110000 _______________ 100010000 - иштин натыйжасы & Алгач биринчи биттерди салыштырабыз эки сандын бири-бири менен, андан кийин экинчи бит, үчүнчү ж.б. Көрүнүп тургандай, эки гана учурда эки бит сандарда 1ге барабар болгон (биринчи жана бешинчи бит). Калган бардык салыштыруулардын жыйынтыгы 0 болду. Демек, жыйынтыгында 100010000 санын алдык. Ондук системада ал 272 санына туура келет. Текшерели:
public class Main {

   public static void main(String[] args) {
       System.out.println(277&432);
   }
}
Консолдук чыгаруу:

272
  • |- бит боюнча "ЖЕ". Иштөө принциби бирдей - биз эки санды аз-аздан салыштырабыз. Эми гана биттердин жок дегенде бири 1ге барабар болсо, натыйжа 1ге барабар болот. Келгиле, ошол эле сандарды карап көрөлү - 277 жана 432:
100010101 | 110110000 _______________ 110110101 - иштин натыйжасы | Бул жерде жыйынтык башкача: эки санда тең нөл болгон бит гана нөл бойдон калды. Иштин натыйжасы 110110101 саны болуп саналат. Ондук системада ал 437 санына туура келет. Текшерели:
public class Main {

   public static void main(String[] args) {
       System.out.println(277|432);
   }
}
Консолдук чыгаруу:

437
Биз баарын туура санадык! :)
  • ^- бит боюнча эксклюзивдүү ЖЕ (ошондой эле XOR катары белгилүү)
Буга чейин мындай операторду кезиктирген эмеспиз. Бирок бул жерде татаал эч нерсе жок. Бул кадимки "же" окшойт. Айырма бир: кадимки "же" trueэгер жок дегенде бир операнд чын болсо кайтарат. Бирок сөзсүз түрдө бирөө эмес - эгер экөө тең бар болсо true- анда натыйжа true. Бирок эксклюзивдүү "же" trueоперанддардын бири чын болсо гана кайтып келет. Эгерде эки операнд тең чын болсо, кадимки “же” кайтып келет true(“жок дегенде бирөө чын”), бирок эксклюзивдүү же кайтат false. Ошондуктан ал эксклюзивдүү деп аталат. Мурунку биттик операциялардын принцибин бorп, сиз 277^432 операциясын оңой эле аткара аласыз. Бирок, келгиле, аны дагы бир жолу чогуу аныктайлы :) 100010101 ^ 110110000 _______________ 010100101 - иштин натыйжасы ^ Мына биздин жыйынтык. Эки санда бирдей болгон биттер 0 кайтарды («бирөө» формуласы иштеген жок). Бирок 0-1 же 1-0 жупту түзгөндөр акыры бирдикке айланган. Натыйжада биз 010100101 санын алдык. Ондук системада ал 165 санына туура келет. Келгиле, туура эсептегенибизди карап көрөлү:
public class Main {

   public static void main(String[] args) {
       System.out.println(277^432);
   }
}
Консолдук чыгаруу:

165
Супер! Баардыгы так биз ойлогондой :) Эми бит жылыштары деп аталган операциялар менен таанышууга убакыт келди. Аты, негизинен, өзү үчүн сүйлөйт. Биз бир нече санды алып, анын биттерин солго жана оңго жылдырабыз :) Келгиле, анын кандай экенин карап көрөлү:

Солго жылдыруу

Биттердин солго жылышы белгиси менен көрсөтүлөт << Мисал:
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 3;//quantity

       int z = (x << y);
       System.out.println(Integer.toBinaryString(x));
       System.out.println(Integer.toBinaryString(z));
   }
}
Бул мисалда сан x=64маани деп аталат. Бул анын биттери, биз алмаштырабыз. Биз биттерди солго жылдырабыз (бул белгинин багыты менен аныкталышы мүмкүн <<) Бинарлык системада 64 саны = 1000000 Сан сан y=3деп аталат. Сандын биттери канча бит оңго/солго жылдырылышы керек x?» деген суроого сан жооп берет. Биздин мисалда биз аларды 3 бит солго жылдырабыз. Смена процессин айкыныраак кылуу үчүн, сүрөттү карап көрөлү. Биздин мисалда int түрүндөгү сандарды колдонобуз. Intкомпьютердин эс тутумунун 32 битти ээлейт. 64 деген баштапкы саныбыз ушундай көрүнөт: Биталдык операциялар - 2Эми биз сөздүн түз маанисинде ар бир битибизди алып, 3 уячага солго жылдырабыз: Биталдык операциялар - 3Бул бизде. Көрүнүп тургандай, биздин бардык биттер жылып, диапазондун сыртынан дагы 3 нөл кошулду. 3 - анткени биз 3кө жылып жатканбыз. Эгерде биз 10го которулсак, 10 нөл кошулмак. Демек, сөз айкашы x << y"у саны уячаларынын биттерин хсолго жылдыруу" дегенди билдирет. Биздин туюнтуунун натыйжасы ондук системада 512ге барабар болгон 1000000000 саны болду. Текшерели:
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 3;//quantity

       int z = (x << y);
       System.out.println(z);
   }
}
Консолдук чыгаруу:

512
Баардыгы туура! Теориялык жактан алганда, бит чексиз жылдырылышы мүмкүн. Бирок бизде номер бар болгондуктан int, 32 гана клетка бар. Алардын ичинен 7 64 (1 000 000) саны ээлеген. Ошондуктан, мисалы, солго 27 сменаны жасасак, биздин жалгыз агрегатыбыз диапазондон чыгып, «жазып» калат. Нөлдөр гана калат!
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 26;//quantity

       int z = (x << y);
       System.out.println(z);
   }
}
Консолдук чыгаруу:

0
Биз күткөндөй, бири 32 биттик клеткалардан ашып, жок болуп кетти. Биз нөлдөн гана турган 32 биттик санды алдык. Биталдык операциялар - 4Албетте, ондук системада ал 0гө туура келет. Солго жылдырууларды эстеп калуунун жөнөкөй эрежеси: Ар бир солго жылдыруу менен сан 2ге көбөйтүлөт. Мисалы, бит менен сүрөтсүз туюнтуунун жыйынтыгын эсептеп көрөлү 111111111 << 3 . 111111111 санын 2ге үч эсе көбөйтүү.Натыйжада биз 888888888 алабыз. Кодду жазып, текшерели:
public class Main {

   public static void main(String[] args) {
       System.out.println(111111111 << 3);
   }
}
Консолдук чыгаруу:

888888888

Оң жылыштар

Алар белги менен белгиленет >>. Алар башка багытта гана ушундай кылышат! :) Келгиле, дөңгөлөктү кайра ойлоп таппайлы жана муну ошол эле int 64 саны менен жасоого аракет кылалы.
public class Main {

   public static void main(String[] args) {
       int x = 64;//meaning
       int y = 2;//quantity

       int z = (x >> y);
       System.out.println(z);
   }
}
Биталдык операциялар - 5Биталдык операциялар - 6Оңго 2ге жылдыруунун натыйжасында биздин сандын эки экстремалдык нөлү чектен чыгып, өчүрүлдү. Биз 10000 санын алдык, ал ондук системада 16 санына туура келет. Консолго чыгаруу:

16
Оңго жылдырууларды эстеп калуунун жөнөкөй эрежеси: Ар бир оң жылыш экиге бөлүнөт, калганын жокко чыгарат. Мисалы, 35 >> 2 35ти 2ге 2 эсеге бөлүү керек дегенди билдирет, калганын таштоо менен 35/2 = 17(1 калдыгын таштоо) 17:2 = 8(1 калганын таштоо) Бардыгы 35 >> 28ге барабар болушу керек. Текшерүү:
public class Main {

   public static void main(String[] args) {
       System.out.println(35 >> 2);
   }
}
Консолдук чыгаруу:

8

Java тorндеги операциялардын артыкчылыгы

Кодду жазып же окуп жатканда, сиз көп учурда бир эле учурда бир нече операциялар аткарылган туюнтмаларга туш болосуз. Алар кандай тартипте аткарыларын түшүнүү абдан маанилүү, антпесе натыйжа күтүүсүз болушу мүмкүн. Javaда көптөгөн операциялар бар болгондуктан, алардын баары атайын tableга бөлүнгөн:

Оператордун артыкчылыгы

Операторлор Артыкчылык
постфикс expr++ expr--
унардык ++expr --expr +expr ~ !
Multiplicative * / %
кошумча + -
жылыш << >> >>>
мамилелүү < > <= >=instanceof
теңдик == !=
биттик ЖАНА &
бит боюнча эксклюзивдүү ЖЕ ^
биттик камтыган ЖЕ |
логикалык ЖАНА &&
логикалык ЖЕ ||
үчтүк ? :
тапшырма = += -= *= /= %= &= ^= |= <<= >>= >>>=
Бардык операциялар солдон оңго, бирок алардын артыкчылыктарын эске алуу менен аткарылат. Мисалы, жазсак: int x = 6 - 4/2; адегенде бөлүү операциясы (4/2) аткарылат. Ал экинчи орунда турса да, ага артыкчылык берилет. Кашалар же чарчы кашаалар каалаган артыкчылыкты максимумга өзгөртөт. Бул мектептен эсиңизде болсо керек. Мисалы, сиз аларды туюнтмага кошсоңуз: int x = (6 - 4)/2; кемитүү биринчи аткарылат, анткени ал кашаанын ичинде эсептелет. &&Таблицадан көрүнүп тургандай, логикалык оператор өтө төмөн артыкчылыкка ээ . Ошондуктан, көбүнчө акыркы аткарылат. Мисалы: boolean x = 6 - 4/2 > 3 && 12*12 <= 119; Бул туюнтма төмөнкүдөй аткарылат:
  • 4/2 = 2

    boolean x = 6 - 2 > 3 && 12*12 <= 119;
  • 12*12 = 144

    boolean x = 6 - 2 > 3 && 144 <= 119;
  • 6-2 = 4

    boolean x = 4 > 3 && 144 <= 119;
  • Андан кийин салыштыруу операторлору аткарылат:

    4 > 3 = true

    boolean x = true && 144 <= 119;
  • 144 <= 119 = false

    boolean x = true && false;
  • Акыр-аягы, акыркы оператор аткарылат &&.

    boolean x = true && false;

    boolean x = false;

    +Мисалы, кошуу оператору ( ), салыштыруу операторуна караганда артыкчылыкка ээ !=(«тең эмес»);

    Ошондуктан сөз айкашында:

    boolean x = 7 != 6+1;

    адегенде 6+1 операциясы аткарылат, андан кийин текшерүү 7!=7 (жалган), аягында натыйжа өзгөрмөгө falseыйгарылат x. Дайындоо жалпысынан бардык операциялардын эң төмөнкү приоритетине ээ - tableдан караңыз.

Фу! Биздин лекция узак болду, бирок сиз аны аткардыңыз! Эгерде сиз ушул жана мурунку лекциялардын айрым бөлүктөрүн толук түшүнбөсөңүз, кабатыр болбоңуз, биз бул темаларга келечекте бир нече жолу токтолобуз. Бул жерде сиз үчүн кээ бир пайдалуу шилтемелер:
  • Логикалык операторлор - логикалык операциялар боюнча JavaRush лекциясы. Биз аларга жакын арада жете албайбыз, бирок аларды азыр окуй аласыз, эч кандай зыяны болбойт
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION