我有这张桌子:
// numbers
+---------+------------+
| id | numb |
+---------+------------+
| int(11) | bit(10) |
+---------+------------+
| 1 | 1001100111 |
| 2 | 0111000101 |
| 3 | 0001101010 |
| 4 | 1111111011 |
+---------+------------+
我正在尝试更改(切换)第七位(从右到左)的值。所以关注这个数字:
// for example
1001100111
^ seventh digit (rtl)
这是预期的结果:
// new_numbers
+---------+------------+
| id | numb |
+---------+------------+
| int(11) | bit(10) |
+---------+------------+
| 1 | 1011100111 |
| 2 | 0101000101 |
| 3 | 0011101010 |
| 4 | 1101111011 |
+---------+------------+
我可以像
那样更新第七位数字// set it to zero
UPDATE numbers SET numb = numb & b'1110111111';
但实际上我需要切换它。
0
,则将其设置为1
1
,则将其设置为0
我该怎么做?
答案 0 :(得分:3)
通过XOR ^
操作完成翻转操作,其掩码在您要切换的位置具有1
个。
这是有效的,因为XOR的真值表如下所示:
A: 0 0 1 1
B: 0 1 0 1
A^B: 0 1 1 0
请注意B
为1
的列:当A
中的相应位为零时,结果为1,反之亦然。
慢跑第七位是这样的:
UPDATE numbers SET numb = numb ^ b'0001000000';
答案 1 :(得分:1)
你可以轻松地使用XOR ^。您可以在任何系统中给出操作数,如1,2,4,8 ...,对于位0,1,2,3或b'1',b'10',b'100'。设置的每个位都被反转。
在你里面Sample是操作数128或b'100000000'
<强>样品强>
SELECT b'1110111110' ^ 1 , b'1110111111' ^ 1 ;
SELECT b'1110111110' ^ 128 , b'1100111111' ^ 128 ;
如果您想将其视为BIT
SELECT BIN( b'1110111110' ^ 1 ), BIN( b'1110111111' ^ 1 );
SELECT BIN( b'1110111110' ^ 128 ), BIN( b'1100111111' ^ 128 );