C语言进阶6:二进制操作
1、位运算
1.1 按位运算
No. | 操作符 | 功能 |
---|---|---|
1 | & | 按位与 |
2 | l | 按位或 |
3 | ~ | 按位取反 |
4 | ^ | 按位异或 |
1.2 运算规则
p | q | p & q | p l q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
1.3 示例
1.3.1 按位与
让某一位或某些位为0。
int n = 0xFFFF;
n = n & 0x0010;
截取二进制数中的一段值。
int n = 0xFFab;
n = n & 0x00FF;
1.3.2 按位或
让某一位或某些位为1。
int n = 0x0000;
n = n | 0x0010;
拼接两个二进制数。
int a = 0xab00;
int b = 0x0012;
int c = a|b;
1.3.3 按位取反
得到全部为1的数字~0。
int n = ~0;// 等同于0xFFFF
使数字的部分清零x& ~7。
int n = 0xFFFF;
n = n & ~7;
1.3.4 按位异或
两个相等数异或结果为0。
int n = 0x1234;
n = n^n;
对同一个变量两次异或,变会原值。
int a = 0x1234;
int b = 0x1357;
a = a^b;
a = a^b;
1.4 练习
1.4.1 只出现一次的数字
(1)做法1
#include <stdio.h>
#include <stdbool.h>
int singleNumber(int *nums,int numsize){
for(int i=0;i<numsize;i++){
bool founded = true;
for(int j=0;j<numsize;j++){
if(i!=j && nums[i]==nums[j]){
founded=false;
break;