第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在不使用第三個(gè)變量的情況下交換兩個(gè)變量值

在不使用第三個(gè)變量的情況下交換兩個(gè)變量值

C++
喵喵時(shí)光機(jī) 2019-08-12 15:48:49
在不使用第三個(gè)變量的情況下交換兩個(gè)變量值在采訪中提出的一個(gè)非常棘手的問題。交換兩個(gè)變量的值,如a=10和b=15。通常要交換兩個(gè)變量值,我們需要第三個(gè)變量,如:temp=a;a=b;b=temp;現(xiàn)在的要求是,在不使用第三個(gè)變量的情況下交換兩個(gè)變量的值。
查看完整描述

3 回答

?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊

使用xor交換算法

void xorSwap (int* x, int* y) {
    if (x != y) { //ensure that memory locations are different
       *x ^= *y;
       *y ^= *x;
       *x ^= *y;
    }}


為什么要測(cè)試?

測(cè)試是為了確保x和y具有不同的內(nèi)存位置(而不是不同的值)。這是因?yàn)?code>(p xor p) = 0如果x和y共享相同的內(nèi)存位置,當(dāng)一個(gè)設(shè)置為0時(shí),兩者都設(shè)置為0.當(dāng)* x和* y都為0時(shí),* x和* y上的所有其他xor操作將相等0(因?yàn)樗鼈兪窍嗤模?,這意味著該函數(shù)將* x和* y都設(shè)置為0。

如果它們具有相同的值但不是相同的內(nèi)存位置,則一切都按預(yù)期工作

*x = 0011*y = 0011//Note, x and y do not share an address. x != y*x = *x xor *y  //*x = 0011 xor 0011//So *x is 0000*y = *x xor *y  //*y = 0000 xor 0011//So *y is 0011*x = *x xor *y  //*x = 0000 xor 0011//So *x is 0011


應(yīng)該使用嗎?

一般情況下,沒有。編譯器將優(yōu)化掉臨時(shí)變量,并且假設(shè)交換是一個(gè)常見的過程,它應(yīng)該為您的平臺(tái)輸出最佳的機(jī)器代碼。

以這個(gè)用C編寫的快速測(cè)試程序?yàn)槔?/p>

#include <stdlib.h>#include <math.h>#define USE_XOR 

void xorSwap(int* x, int *y){
    if ( x != y ){
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
    }}void tempSwap(int* x, int* y){
    int t;
    t = *y;
    *y = *x;
    *x = t;}int main(int argc, char* argv[]){
    int x = 4;
    int y = 5;
    int z = pow(2,28); 
    while ( z-- ){#       ifdef USE_XOR
            xorSwap(&x,&y);#       else
            tempSwap(&x, &y);#       endif
    }
    return x + y;    }

編譯使用:

gcc -Os main.c -o swap

xor版本需要

real    0m2.068suser    0m2.048ssys  0m0.000s

帶臨時(shí)變量的版本在哪里:

real    0m0.543suser    0m0.540ssys  0m0.000s


查看完整回答
反對(duì) 回復(fù) 2019-08-12
?
海綿寶寶撒

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊

一般形式是:

A = A operation B
B = A inverse-operation B
A = A inverse-operation B

但是,您必須注意溢出,并且并非所有操作都具有針對(duì)定義操作的所有值明確定義的逆。例如*和/工作直到A或B為0

xor特別令人滿意,因?yàn)樗轻槍?duì)所有整數(shù)定義的,并且是它自己的逆


查看完整回答
反對(duì) 回復(fù) 2019-08-12
?
慕桂英3389331

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊

a = a + b
b = a - b // b = a
a = a - b


查看完整回答
反對(duì) 回復(fù) 2019-08-12
  • 3 回答
  • 0 關(guān)注
  • 1102 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)