我正在創建一個國際象棋程序和用於董事會代表的位置,我正在使用位板。白棋子的棋盤看起來是這樣的:在特定數量的位置上僅移位整數中的1位
whitePawns=0x000000000000FF00;
現在,如果我想搬到廣場上D4白色的棋子,我會通過8個或者10位到第12位移,使得可以進入下一個等級。我想在不干擾其餘位的位置的情況下移動第12位。我怎麼做?
移位whitePawns變量應該看在此之後:
whitePawns=0x0000000008F700;
我正在創建一個國際象棋程序和用於董事會代表的位置,我正在使用位板。白棋子的棋盤看起來是這樣的:在特定數量的位置上僅移位整數中的1位
whitePawns=0x000000000000FF00;
現在,如果我想搬到廣場上D4白色的棋子,我會通過8個或者10位到第12位移,使得可以進入下一個等級。我想在不干擾其餘位的位置的情況下移動第12位。我怎麼做?
移位whitePawns變量應該看在此之後:
whitePawns=0x0000000008F700;
我認爲你不想換班,你想換個位。嘗試關閉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.
}
這個解決方案部分接近我的想法。如果我想移動我的棋子,那麼該怎麼辦?在這種情況下,我不能交換。我只是想稍微改變位置到位置B.它必須覆蓋位B的值。無論它是什麼值。 – 2014-10-12 03:34:51
而不是偏移一點,你可以從舊位置刪除1
,並把它在新的位置。
例如,如果您知道位置5的位已設置,並且未設置位置12的位,並且您想將第五位移到第12位,則可以使用單XOR:
whitePawns ^= ((1 << 5) | (1 << 12));
這種工作方式是,異或值帶着面具「翻轉」用掩碼1S標註值的所有位。在這種情況下,蒙版被構造爲在位置5和12中具有1。當與位置異或時,第五位中的第一位變爲零,並且第十二位中的零變爲1.
如果位置12的位被設置,這會工作嗎?這種情況下的修改是什麼? – 2014-10-12 03:35:09
@RohitShinde如果位置12的位被設置,這將不起作用,因爲'XOR'翻轉標記爲1的位。如果你想重置一個位爲零,使用'v&=〜(1 << i)'。要無條件設置,使用'v | =(1 << i)'。我認爲XOR可以很好地工作的原因是棋子不能代替國際象棋中的相同顏色。 – dasblinkenlight 2014-10-12 03:40:26
什麼是你的問題? – 2014-10-12 03:16:48
[使用位域或按位運算符在一個字節內移動一點點]的可能重複(http://stackoverflow.com/questions/6431107/moving-a-bit-within-a-byte-using-bitfield-or-bitwise-運算符) – user657267 2014-10-12 03:18:00
我想在整數內移位一個位而不會干擾其他位。 – 2014-10-12 03:21:18