如何将二进制数的单个位更新为切换?

时间:2016-05-06 13:09:04

标签: mysql sql

我有这张桌子:

// 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

我该怎么做?

2 个答案:

答案 0 :(得分:3)

通过XOR ^操作完成翻转操作,其掩码在您要切换的位置具有1个。

这是有效的,因为XOR的真值表如下所示:

  A: 0 0 1 1
  B: 0 1 0 1
A^B: 0 1 1 0

请注意B1的列:当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 );