2017-04-17 39 views
0

下面我正在嘗試將操作後的值與自身進行比較我只想在它更改時才返回它。我嘗試了下面的代碼,但我無法在表達式中聲明變量。有沒有辦法做到這一點?更改一個值並知道它是否在一行中更改

​​

注意,我問這個的原因是效率,這樣我就不必如下評價表達兩次

for (int i = 0; i < SIZE; ++i) 
     if (ray[i] != (ray[i] & (1u << 5)) 
       return (ray[i] & (1u << 5); //EVALUATING THE EXPRESSION TWICE 

是否有辦法我可以做一個操作並知道它是否改變了第一個標記的值? (這也可以解決這個問題)

+1

它真的必須在一條線上嗎?如果你在某處宣佈了'a',我認爲你的第一個例子會起作用。 – Jay

+1

確實,這裏真正的問題是不使用括號的習慣:) – Zong

+0

'ray [i]'是什麼類型?更重要的是,它能否成爲負面? – Peter

回答

1

首先,認識到除非ray已被認定爲volatile(或類似的東西atomic,以確保從另一個線程變化是顯而易見的),機會是非常好的,這一切都不是怎麼回事編譯器會假設從同一位置進行兩次沒有插入寫入的讀取將始終產生相同的結果,並且只讀取一次(然後使用它從同一寄存器兩次)。

假設這是volatileatomic(或其他線程可見),我可能會做這樣的事情:

for (int i = 0; i < SIZE; ++i) { 
    int first = ray[i]; 
    int second = ray[i] & (1U << 5); 
    if (second != first) 
     return second; 
} 

假設一個半路出家的編譯器,我期望firstsecond放置在寄存器中,所以開銷會非常小。

0

這可能幫助:

for (int i = 0; i < SIZE; ++i) 
    if (ray[i] != 32 && ray[i] != 0) 
      return (ray[i] & (1u << 5)); 

在代碼中,如果部分纔會被執行,如果ray[i] is not equal to (ray[i] & (1u << 5)),所以首先讓我們來看看什麼時候才能ray[i]等於(ray[i] & (1u << 5)): 由於(ray[i] & (1u << 5))結果要麼是0或32取決於ray[i]右邊的第6位分別是0還是1。 因此,我將if條件更改爲ray[i] != 32 && ray[i] != 0,即如果操作(位操作和全部)的執行數不是32且不是0,那麼只有我們通過if條件檢查,就像在代碼中一樣。 希望這有助於。

+2

我得到你所做的。但是,操作量仍然保持在3(即沒有實際收益)。此外,這是一個有點太具體到這種情況下(我的實際代碼包含'ray [i]&〜(1ULL <<(move.init-1)',不能像這樣解決。感謝您的建設性的想法,雖然! –

相關問題