位运算
1、按位取反 ~(你真我假)
void test01()
{
int num = 2;
// 010 取反
// 101 源码
//计算机用补码方式存数据 110 + 1 = 111
printf("~num = %d\n", ~num); // -3
}
2、 按位与&(全真为真,有假为假)
一个数与1按位与(&)结果为1,则此数为奇数,否则为偶数
01010101
00000001 &
00000001 奇数
01010100
00000001 &
00000000 偶数
void test02()
{
int num = 123;
if ( (num & 1 ) == 1 )
{
printf("num为奇数\n");
}
else
{
printf("num为偶数\n");
}
}
3、按位或 | (全假为假,有真为真)
按位或(|)可将指定位置为 1
00100001
10001000 |
10101001
void test03()
{
int num1 = 5;
int num2 = 3;
printf("num1 | num2 = %d\n", num1 | num2); // 7
}
4、按位异或 ^(相同为假,不同为真)
可实现两个数交换
A ^ B = R
A ^ R = B
B ^ R = A
void test04()
{
int num1 = 5;
int num2 = 9;
//int tmp = num1; //1、两个数交换
//num1 = num2;
//num2 = tmp;
num1 = num1 ^ num2; //2、两个数交换
num2 = num1 ^ num2;
num1 = num1 ^ num2;
//num1 = num1 + num2; //3、两个数交换
//num2 = num1 - num2;
//num1 = num1 - num2;
printf("num1 = %d\n", num1);
printf("num2 = %d\n", num2);
}
5、左移运算 <<
将一个运算对象的各位二进制位全部左移若干位(左边的二进制位丢弃,右边补0)
A=0011 1100
A<<2 -----> 1111 0000
左移X位代表乘以2^X次方次幂
void test05()
{
int num = 20; // 20 * 2 ^ 2;
printf("%d\n", num <<= 2);
}
6、右移运算>>
将一个运算对象的各位二进制位全部左移若干位(正数左边补0,复述左边补1,右边丢弃)
A=0011 1100
A>>2 -----> 0000 1100
左移X位代除以2的X次幂
void test06()
{
int num = 20; // 20 / 2
printf("%d\n", num >>= 1);
}
#include <stdio.h>
int main()
{
unsigned int a = 60; /* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
printf("Line 1 - c 的值是 %d\n", c );
c = a | b; /* 61 = 0011 1101 */
printf("Line 2 - c 的值是 %d\n", c );
c = a ^ b; /* 49 = 0011 0001 */
printf("Line 3 - c 的值是 %d\n", c );
c = ~a; /*-61 = 1100 0011 */
printf("Line 4 - c 的值是 %d\n", c );
c = a << 2; /* 240 = 1111 0000 */
printf("Line 5 - c 的值是 %d\n", c );
c = a >> 2; /* 15 = 0000 1111 */
printf("Line 6 - c 的值是 %d\n", c );
}
运行结果:
Line 1 - c 的值是 12
Line 2 - c 的值是 61
Line 3 - c 的值是 49
Line 4 - c 的值是 -61
Line 5 - c 的值是 240
Line 6 - c 的值是 15