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。
使用异或操作,两个相等的数异或的结果为 0,而 0 与任何一个数异或的结果为这个数。
例如: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 | | |
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:
异或操作,两个相等的数异或的结果为 0,而 0 与任何一个数异或的结果为这个数。
'f' ^ 'm' ^ 'f' = 'm'
'm' ^ 'm' ^ 'f' = 'f'
UPDATE salary SET sex = CHAR ( ASCII(sex) ^ ASCII( 'm' ) ^ ASCII( 'f' ) );