更改数字的 Solidity 按位运算无法正确更新
Solidity bitwise operation changing a number does not update correctly
所以我使用位图将 32 个 uint8 打包到一个 uint256 中,但是当我尝试更改 uint8 的值时,它没有正确更新。例如,当将 222 更改为 221 时,它变为 223,我知道为什么会这样,但我不知道更新它的正确方法是什么,先将 uint8 更改为 0 然后再更新它是否正确?怎么做到的?
uint256 bitmap;
// setting the value for the first time
bitmap |= 222>>0;
bitmap |= 150>>8;
// and so on...
// updating the value
bitmap |= 221<<0; // when calling this, it becomes 223
// tried to change the value to 0 first
bitmap &= ~(1<<0);
bitmap |= 221<<0;
// still becomes 223
可能还是不太明白按位运算符的工作原理,如何更新值?
222 是二进制 1101 1110
221 是二进制 1101 1101
当你222 or 221
赋值给bitmap时,第二位和最右位都变成了1,所以就变成了
223, 1101 1111
您可以通过多种方式更改整数中的特定字节,但这会有所帮助:
bitmap &= ~(0xFF << 0) | (221 << 0) // change 0 to byte index, 0 is the rightmost byte
所以我使用位图将 32 个 uint8 打包到一个 uint256 中,但是当我尝试更改 uint8 的值时,它没有正确更新。例如,当将 222 更改为 221 时,它变为 223,我知道为什么会这样,但我不知道更新它的正确方法是什么,先将 uint8 更改为 0 然后再更新它是否正确?怎么做到的?
uint256 bitmap;
// setting the value for the first time
bitmap |= 222>>0;
bitmap |= 150>>8;
// and so on...
// updating the value
bitmap |= 221<<0; // when calling this, it becomes 223
// tried to change the value to 0 first
bitmap &= ~(1<<0);
bitmap |= 221<<0;
// still becomes 223
可能还是不太明白按位运算符的工作原理,如何更新值?
222 是二进制 1101 1110
221 是二进制 1101 1101
当你222 or 221
赋值给bitmap时,第二位和最右位都变成了1,所以就变成了
223, 1101 1111
您可以通过多种方式更改整数中的特定字节,但这会有所帮助:
bitmap &= ~(0xFF << 0) | (221 << 0) // change 0 to byte index, 0 is the rightmost byte