正整数:原码反码补码是相同的
正整数:第一个位符号位,正数符号为0
1 = 0000 0000 0000 0000 0000 0000 0000 0001
对于负数
-1原码 1000 0000 0000 0000 0000 0000 0000 0001
反码:原码符号位不变,其他位取反(0变1,1变0)
-1 1111 1111 1111 1111 1111 1111 1111 1110
补码:反码 + 1
-1 1111 1111 1111 1111 1111 1111 1111 1111
在计算机中存储的就是数字“补码”
0000 0000 0000 0000 0000 0000 0000 0001
+ 1111 1111 1111 1111 1111 1111 1111 1111
--------------------------------------------
0000 0000 0000 0000 0000 0000 0000 0000
正数:13 0000 0000 0000 0000 0000 0000 0000 1101
负数 -13补码就是正数取反+1
1111 1111 1111 1111 1111 1111 1111 0011
位运算:针对二进制位运算
& 按位与:对应的二进制位上,一个为0就是0,全1才为1
一假则假
| 按位或对应的二进制位上,一个为1就是1,全0才为0
一真则真
^ 按位异或对应的二进制位上,不同为1,相同为0
1、多个数相互异或交换顺序结果不变(类似加法交换律)
2、任何数异或上0都是原来的数
3、相同的数相互异或结果为0
~ 按位取反:对应的二进制位上,0变1,1变0
>> 右移 m >> n : m向右移动n位:移出来的位直接删掉,移入位补符号位(正数补0,负数补1)
使用场景:快速计算一个数除以2的n次方,对于一个整数来说右移几位就是除以2几次方
<< 左移 m << n : m向左移动n位,移出来的位直接删掉,移入位补0
左移可能会改变符号位
使用场景:当数比较小时候,可以快速的计算这个数乘以2多少次方
快速计算2的3次方
/*
1、交换两个变量的值,不借助中变量
2、判断一个数的奇偶性
*/
void test()
{
int a = 30;
int b = 20;
/* 借助中间变量 */
// int temp = a;
// a = b;
// b = temp;
// 第一种方式:算术运算
// a = a - b;
// b = a + b;// b = 原a - 原b +原b = 原a
// a = b - a;// a = 原a - (原a -原b) =原a - 原a + 原b =原b
// 第二种方式:异或运算
a = a ^ b;
b = a ^ b; // 原a ^ 原b ^原b = 原a ^ 0 = 原a
a = a ^ b; // 原a ^ 原b ^原a = 原a ^ 原a ^原b = 0 ^ 原b = 原b
printf("%d,%d\n",a,b);
}
// 2、判断一个数的奇偶性
int main(int argc,const char * argv[]) {
int n = 10;
// 第一种方式
if (n % 2 ==0) {
printf("偶数\n");
}else{
printf("奇数\n");
}
// 第二种方式:(不推荐使用)
int rs = n % 2 == 0 ? printf("偶数\n") : printf("奇数\n");
printf("%d\n",rs);
// 第三种方式:&
/*
101
& 001
----
1
*/
if (n & 1) {
printf("奇数\n");
}else{
printf("偶数\n");
}
return 0;
}