void swap1(int a,int b)
{
    a = a + b;
    b = a - b;
    a = a - b;
}
void swap2(int a,int b)
{
    a = a * b;
    b = a / b;
    a = a / b;
}
void swap3(int a,int b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

异或位运算效率最高,不越界。

使用位运算交换两个数,是利用了异或的自反性: a^b^b=a^0=a;

1.与运算(&)

运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;

       即:两位同时为“1”,结果才为“1”,否则为0

例如:3&5  即 0000 0011 & 0000 0101 = 0000 0001   因此,3&5的值得1。

例如:9&5  即 0000 1001 (9的二进制补码)&00000101 (5的二进制补码) =00000001 (1的二进制补码)可见9&5=1。

2.或运算(|)

规则:0|0=0;   0|1=1;   1|0=1;    1|1=1;

   即 :参加运算的两个对象只要有一个为1,其值为1。

例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111   因此,3|5的值得7。 

例如:9|5可写算式如下: 00001001|00000101 =00001101 (十进制为13)可见9|5=13

3.异或运算(^)

运算规则:0^0=0;   0^1=1;   1^0=1;   1^1=0;

  即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

使用异或操作两个相等的数异或的结果为 00 与任何一个数异或的结果为这个数。

例如:9^5可写成算式如下: 00001001^00000101=00001100 (十进制为12)可见9^5=12  

 

此时可以来一道Leecode的数据库测试题:Swap Salary

https://leetcode.com/problems/swap-salary/description/

Description

 

| id

| name

| sex

| salary |

| 1

| A

| m

| 2500

|

| 2

| B

| f

| 1500

|

| 3

| C

| m

| 5500

|

| 4

| D

| f

| 500

|

只用一个 SQL 查询sex 字段反转。

| id

| name

| sex

| salary |

| 1

| A

| f

| 2500

|

| 2

| B

| m

| 1500

|

| 3

| C

| f

| 5500

|

| 4

| D

| m

| 500

|

IF

EXISTS salary;

CREATE TABLE salary ( id INT, NAME VARCHAR ( 100 ), sex CHAR ( 1 ), salary INT ); INSERT INTO salary ( id, NAME, sex, salary )

VALUES

( '1', 'A', 'm', '2500' ), ( '2', 'B', 'f', '1500' ), ( '3', 'C', 'm', '5500' ), ( '4', 'D', 'f', '500' );

ANSWER:

异或操作,两个相等的数异或的结果为 00 与任何一个数异或的结果为这个数。

'f' ^ 'm' ^ 'f' = 'm'

'm' ^ 'm' ^ 'f' = 'f'

UPDATE  salary  SET sex = CHAR ( ASCII(sex) ^ ASCII( 'm' ) ^ ASCII( 'f' ) );