Что делает применение XOR между инструкциями ввода и данными учетной записи в этом смарт-контракте Solana?
https://github.com/solana-labs/break/blob/master/program/src/lib.rs
use solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey,
};
entrypoint!(process_instruction);
fn process_instruction<'a>(
_program_id: &Pubkey,
accounts: &'a [AccountInfo<'a>],
instruction_data: &[u8],
) -> ProgramResult {
// Assume a writable account is at index 0
let mut account_data = accounts[0].try_borrow_mut_data()?;
// xor with the account data using byte and bit from ix data
let index = u16::from_be_bytes([instruction_data[0], instruction_data[1]]);
let byte = index >> 3;
let bit = (index & 0x7) as u8;
account_data[byte as usize] ^= 1 << (7 - bit);
Ok(())
}
Это из одного из их примеров приложений, на самом деле не знаю, что с этим делать, или где можно даже начать смотреть, чтобы понять, что здесь замысел и как он работает ...
Заранее спасибо.
РЕДАКТИРОВАТЬ: Это сделано для создания программного адреса? Я нашел это в их API, и мне кажется, что вышесказанное имеет смысл в качестве реализации этого, как я могу себе представить.
1 ответ
1 << n
наборы
n
бит того, что называется маской, например
1 << 1 = 0010
.
XOR - полезная операция, которая позволяет сравнивать биты, и в этом случае она использует это свойство. Если текущий бит равен 0, он будет установлен в 1, а если он равен 1, он будет установлен в 0.
Используя указанную выше маску, мы можем выбрать один конкретный бит для сравнения или, в данном случае, переключиться в зависимости от текущего значения.
1111 ^ 0010 = 1101
, результатом будет разница, бит, который соответствует, устанавливается в
0
.
1101 ^ 0010 = 1111
, здесь каждый бит отличается, поэтому бит, который не совпадает, также устанавливается на
1
.
Короче говоря, он немного переключается, это обычная идиома в коде битовых манипуляций.
bits ^= 1 << n
Связанный: /questions/10497706/kak-vyi-ustanavlivaete-ochischaete-i-pereklyuchaete-odin-bit/10497734#10497734