更改数字的 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