Кіріспе

Бинарлық арифметикалық алгоритм

Компьютерлік бағдарламалауда, эксклюзивті немесе алмастыру (кейде XOR алмастыру деп қысқартылады) – екі айнымалының мәндерін уақытша айнымалы қолданбай алмастыру үшін эксклюзивті немесе биттік операциясын пайдаланатын алгоритм. Алгоритм көбінесе жаңалық ретінде және эксклюзивті немесе операциясының қасиеттерін көрсету тәсілі ретінде қолданылады. Ол кейде бағдарламаны оңтайландыру ретінде талқыланады, бірақ эксклюзивті немесе арқылы алмастыру стандартты, түсінікті тәсілге қарағанда көбінесе артықшылық бермейді.

Іс жүзінде аулақ болу себептері

Қазіргі заманғы CPU архитектураларында XOR техникасы уақытша айнымалы қолданып ауыстырудан баяу болуы мүмкін. Кем дегенде, AMD және Intel компанияларының соңғы x86 процессорларында тіркелімдер арасындағы деректерді жылжыту әдетте кідіріс тудырмайды. (Бұл MOV жою деп аталады.) Егер қолдануға архитектуралық тіркелімдер жетпесе де, XCHG командасы үш XOR операциясынан кем емес жылдамдықпен орындалады. Тағы бір себеп – қазіргі заманғы процессорлар нұсқау құбырлары арқылы нұсқауларды параллель түрде орындауға ұмтылады. XOR техникасында әрбір операцияның нәтижесі алдыңғы операцияның нәтижесіне байланысты болғандықтан, оларды қатаң тізбекпен орындау қажет, бұл нұсқау деңгейіндегі параллелизмнің артықшылықтарын жояды.

Аталық атауы

XOR алмасуы практикада псевдонимдердің болуымен де қиындатылады. Егер XOR көмегімен қандай да бір жад орынының мазмұнын өзімен алмастыруға тырысылса, нәтижесінде ол жад орыны нөлге теңеліп, оның мәні жоғалады. Сондықтан, егер псевдонимдер пайда болу мүмкіндігі болса, жоғары деңгейдегі бағдарламалау тілінде XOR алмасуын сақтықсыз қолдануға болмайды. Егер бұл техника екі тіркегіштің мазмұнын алмастыру үшін құрастыру тілінде қолданылса, бұл мәселе туындамайды. Дженсеннің құрылғысындағы i және A[i] айнымалыларын уақытша айнымалы арқылы алмастыру, аргументтердің байланысты болуына байланысты дұрыс емес нәтижелерге әкеледі: temp = i; i = A[i]; A[i] = temp түріндегі алмастыру екінші операторда i-нің мәнін өзгертеді, ал үшінші операторда A[i] үшін бұрыс i мәнін пайдалануға себеп болады.

Бөлшектерді тіркеу туралы өтініш

Арнайы алмасу нұсқаулығы жоқ архитектураларда, себебі ол қосымша уақытша тіркеуішті пайдалануды болдырмайды, оптималды тіркеуіштерді бөлу үшін XOR алмасу алгоритмі қажет. Бұл, әсіресе тіркеуіштерді бөлу үшін статикалық бір тапсырма пішімін пайдаланатын компиляторлар үшін маңызды; мұндай компиляторлар кейде тіркеуіштер бос болмағанда екі тіркеуішті алмастыру қажет болатын бағдарламаларды жасайды. XOR алмасу алгоритмі қосымша тіркеуішті резервте ұстау немесе кез келген тіркеуіштерді негізгі жадқа төгу қажеттілігін болдырмайды. Қосу/азайту түрі де осы мақсатта қолданылуы мүмкін. Бұл әдіс, әсіресе GPU шейдер компиляторлары үшін маңызды. Қазіргі заманғы GPU архитектураларында айнымалыларды жадқа төгу, шектеулі жад ені мен жоғары жад кешігуі салдарынан қымбатқа түседі, ал тіркеуіштерді пайдалануды шектеу тіркеуіштер файлын динамикалық бөлу арқылы өнімділікті арттыруға мүмкіндік береді. Сондықтан кейбір GPU компиляторлары XOR алмасу алгоритмін қажет етеді.