2014-10-12 60 views
0

我正在創建一個國際象棋程序和用於董事會代表的位置,我正在使用位板。白棋子的棋盤看起來是這樣的:在特定數量的位置上僅移位整數中的1位

whitePawns=0x000000000000FF00;

現在,如果我想搬到廣場上D4白色的棋子,我會通過8個或者10位到第12位移,使得可以進入下一個等級。我想在不干擾其餘位的位置的情況下移動第12位。我怎麼做?

移位whitePawns變量應該看在此之後:

whitePawns=0x0000000008F700;

+0

什麼是你的問題? – 2014-10-12 03:16:48

+0

[使用位域或按位運算符在一個字節內移動一點點]的可能重複(http://stackoverflow.com/questions/6431107/moving-a-bit-within-a-byte-using-bitfield-or-bitwise-運算符) – user657267 2014-10-12 03:18:00

+0

我想在整數內移位一個位而不會干擾其他位。 – 2014-10-12 03:21:18

回答

1

我認爲你不想換班,你想換個位。嘗試關閉A位,然後打開B位。像這樣:

whitePawns &= ~(1 << A); // Turn bit A off 
whitePawns |= (1 << B); // Turn bit B on 

其中A和B是你想要交換的位的位置。

編輯:無論此舉是否有效是另一個故事,使只有當鑽頭B未設置(也可能是其他條件)的舉動:

if (!(whitePawns & (1 << B))) { 
    // Make the swap. 
} 
+0

這個解決方案部分接近我的想法。如果我想移動我的棋子,那麼該怎麼辦?在這種情況下,我不能交換。我只是想稍微改變位置到位置B.它必須覆蓋位B的值。無論它是什麼值。 – 2014-10-12 03:34:51

3

而不是偏移一點,你可以從舊位置刪除1,並把它在新的位置。

例如,如果您知道位置5的位已設置,並且未設置位置12的位,並且您想將第五位移到第12位,則可以使用單XOR:

whitePawns ^= ((1 << 5) | (1 << 12)); 

這種工作方式是,異或值帶着面具「翻轉」用掩碼1S標註值的所有位。在這種情況下,蒙版被構造爲在位置5和12中具有1。當與位置異或時,第五位中的第一位變爲零,並且第十二位中的零變爲1.

+0

如果位置12的位被設置,這會工作嗎?這種情況下的修改是什麼? – 2014-10-12 03:35:09

+1

@RohitShinde如果位置12的位被設置,這將不起作用,因爲'XOR'翻轉標記爲1的位。如果你想重置一個位爲零,使用'v&=〜(1 << i)'。要無條件設置,使用'v | =(1 << i)'。我認爲XOR可以很好地工作的原因是棋子不能代替國際象棋中的相同顏色。 – dasblinkenlight 2014-10-12 03:40:26