#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//1.按位取反 ~
void test01(){
int num = 2;
printf("~num=%d\n",~num);
}
//2.按位与
void test02(){
int num = 124;
if ((num & 1) == 0){
printf("num是偶数\n");
}
else
{
printf("num是奇数\n");
}
}
//3.按位或 |
void test03(){
int num1 = 5;
int num2 = 3;
printf("num1|num2=%d\n",num1|num2);
}
//4.按位异或^
void test04(){
int num1 = 10;
int num2 = 20;
printf("num1=%d\n",num1);
printf("num2=%d\n", num2);
//1.使用temp交换两个数
//2.使用按位异或实现两个数的交换
num1 = num1^num2;
num2 = num1^num2;
num1 = num1^num2;
//3.不使用临时数字实现两个变量的交换
//num1=num1+num2;
//num2=num1-num2;
//num1=num1-num2;
printf("交换后\n");
printf("num1 = %d\n", num1);
printf("num2 = %d\n", num2);
}
//5.左移运算符
void test05(){
int num = 10;
printf("%d\n",num<<=2); //40 左移变大,后面添加0
}
//6.右移动运算符
void test06(){
int num = 10;
printf("%d\n",num>>1); //5 右移变小
}
int main(){
return 0;
}
使用技巧:
1.一个数跟自己异或 结果是0
2.一个数跟0 异或 结果是自身
a^a=0 a^0=a
3.找出出现一次的数字(最主要利用上面的两条规律)
#include<stdio.h>
#define N 5
int main(){
int a[N] = {6,4,3,4,6};
int ret = 0;
for (int i = 0; i < N; i++)
{
ret = ret^a[i];
}
printf("%d\n", ret);
return 0;
}
4.给定一个数,判断是不是2的幂次
1000 0000
0111 1111 让 自身 与 自身-1进行相与 如果符合要求,结果为0 否则不为0
#include<stdio.h>
int main(){
int i = 4;
printf("%d",i&(i-1));
}