1. & 按位与
1> 功能
只有对应的两个二进位均为1时,结果位才为1,否则为0。
2> 举例: 比如9&5,其实就是1001&101=1,因此9&5=1
3> 规律
二进制中,与1相&就保持原位,与0相&就为0
2. | 按位或
1> 功能
只要对应的二个二进位有一个为1时,结果位就为1,否则为0。
2> 举例: 比如9|5,其实就是1001|101=1101,因此9|5=13
3. ^ 按位异或
1> 功能
当对应的二进位相异(不相同)时,结果为1,否则为0。
2> 举例: 比如9^5,其实就是1001^101=1100,因此9^5=12
3> 规律
相同整数相^的结果是0。比如5^5=0
多个整数相^的结果跟顺序无关。比如5^6^7=5^7^6
因此得出结论:a^b^a = b
4. ~ 取反
对整数a的各二进位进行取反,符号位也取反(0变1,1变0)
5. << 左移
把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方
由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性
6. >> 右移
把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方
为正数时, 符号位为0,最高位补0
为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定
7.学习代码
#include <stdio.h> int main()
{
/* 按位与 & 10101010000
00000100000
-------------
00000000000 10111011
10101101
---------
10101001 1001
0101
-----
0001
*/ /*
按位或 |
1001
0101
-----
1101
*/ /*
按位异或 ^
1.相同数值进行异或,结果肯定是0,比如9^9
2.交换 9^5^6 == 9^6^5
3.任何数值跟0进行异或,结果还是原来的数值,9^0 == 9
4.a^b^a == a^a^b == 0^b == b 1001
0101
-----
1100 1001
1001
-----
00000 0101
0000
----
0101 9^5^9 == 9^9^5 = 0^5 = 5 a^b^a == b
*/
//printf("%d\n", 9^9); //printf("%d\n", 9 ^ 5); /*
按位取反 ~
~0000 0000 0000 0000 0000 0000 0000 1001
1111 1111 1111 1111 1111 1111 1111 0110
*/
//printf("%d\n", ~9); /*
左移 << 0000 0000 0000 0000 0000 0000 0000 0000
00 0000 0000 0000 0000 0000 0000 100100 9<<1 -> 9 * 2的1次方 == 18
9<<2 -> 9 * 2的2次方 ==36
9<<n -> 9 * 2的n次方
*/ //printf("%d\n", 9<<1); /*
右移 >>
0000 0000 0000 0000 0000 0000 0000 0000
000000 0000 0000 0000 0000 0000 0000 10
111111 1111 1111 1111 1111 1111 1111 10 8>>1 -> 8/2 == 4
8>>2 -> 8/2的2次方 == 2
8>>n -> 8/2的n次方
*/ printf("%d\n", >>); return ;
}
#include <stdio.h> /*
使用位异或运算符交换两个变量的值
*/ int main()
{
int a = ;
int b = ; /* 借助第三方变量
int temp = a;
a = b;
b = temp;
*/ /*
a = b - a;
b = b - a;
a = b + a;
*/ // a^b^a == b // a --> 10^11
// b --> 10
a = a ^ b;
b = a ^ b;
a = a ^ b; printf("a=%d, b=%d\n", a, b); return ;
}
#include <stdio.h>
/*
用位与&运算符判断变量的奇偶性
*/
int main()
{
/*
15: 1111
9: 1001 14: 1110
10: 1010
*/
int a = ; a& == // 奇数
a& == // 偶数 /*
if (a%2) {
printf("奇数\n");
} else {
printf("偶数\n");
}*/ //a%2==0?printf("偶数\n"):printf("奇数\n"); //a%2?printf("奇数\n"):printf("偶数\n"); return ;
}
/*
写一个函数,用来输出整数在内存中的二进制形式
*/ #include <stdio.h>
void printBinary(int number); int main()
{
/*
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1111 9 : 0000 0000 0000 0000 0000 0000 0000 1001
-10 : 1111 1111 1111 1111 1111 1111 1111 0110
*/ //printf("%d\n", ~9); printBinary(-);
return ;
} void printBinary(int number)
{ // 记录现在挪到第几位
// (sizeof(number)*8) - 1 == 31
int temp = ( sizeof(number)<< ) - ; while ( temp >= )
{
// 先挪位,再&1,取出对应位的值
int value = (number>>temp) & ;
printf("%d", value); //
temp--; // 每输出4位,就输出一个空格
if ( (temp + ) % == )
{
printf(" ");
}
} printf("\n");
}