#include<iostream>
#include<stdlib.h>
using namespace std;
int main(int argc, char const *argv[])
{
// 位运算
// 按位与运算符 & 只有都为真的情况下才会是1 其余是0
// 按位或运算符 |
// a= 5(00000101) b=9(00001001)
unsigned char a = 5, b = 9;
//结果是 000000001
printf("a=%d, b=%d\n", a, b);
printf("a&b=%d\n", a&b);
//结果是 00001101 只要有1则是1 否则都是0
printf("a|b=%d\n", a|b);
//结果是 00001100 相同为0 不同为1
printf("a^b=%d\n", a^b);
//结果是 11111010
printf("~a=%d\n", ~a);
//移位运算 左移一位表示左操作数乘以2^1 右移一位表示左操作数除以2^1
//左移1位 00010010 2^4+2^1 = 16+2 = 18
printf("b<<1=%d\n", b<<1);
//右移1位 00000100 2^2 = 4
printf("b>>1=%d\n", b>>1);
// 掩码
// 如果要对一个整数中的某些位进行操作,怎么表示这些未在整数中的位置,可以利用掩码(Mask)来进行,
// 比如掩码0x0000ff00表示对一个32整数的8~15位进行操作
//1. 取出8-15位
unsigned int a1, b1, mask = 0x0000ff00;
//16进制中2个数字代表一个字节,也就是8位,所以取出8-15位为就是取出56这两个数字
a1 = 0x12345678;
b1 = (a1 & mask) >>8;//
printf("b1=%x\n", b1); //0x56
//2. 将8~15位清0
unsigned int a2, b2, mask2 = 0x0000ff00;
a2 = 0x12345678;
b2 = a2 & ~mask2;
printf("b2=%x\n", b2); // 12340078
//3. 将8~15位置为1
unsigned int a3, b3, mask3 = 0x0000ff00;
a3 = 0x12345678;
b3 = a3 | mask3;
printf("b3=%x\n", b3); //1234ff78
// 异或运算的一些特性
//1. 一个数和自己做异或的结果是0
unsigned int a4 = 10;
printf("a4=%d\n", (a4^a4)); // 0
//2. 从异或的真值表可以看出,不管是0还是1,和0做异或值不变,
//和1做异或得到原值的相反值。可以利用这个特性配合掩码实现某些位的翻转,
unsigned int a5, b5, mask5 = 1 <<6;
a5 = 0x12345678;
b5 = a5 ^ mask5;
printf("b5=%x\n", b5);
//3. x^x^y==y, 因为x^x==0, 0^y==y
// 这个性质可以交换两个变量,不用借助额外的存储空间,所以就不需要采用 temp = a; a=b; b=temp
// 利用一下方法就可以进行交换
// a = a ^ b; a= a0 ^ b0
// b = b ^ a; b= b ^ a = b0 ^ a0 ^ b0 = b0^b0 ^ a0 ==> a0
// a = a ^ b; a= a ^ b = a0^b0^a0 = b0
// 由此可见,两个数字 a, b 数值进行了交换
//int a6 = 6, b6 = 4;
//int c = b6 ^ a6 ^ b6;
//a6^a6^b6 == a6^b6^a6 true
int a6 = 6, b6 = 4;
a6 = a6^b6;
b6 = b6^a6;
a6 = a6^b6;
printf("a6=%d, b6=%d\n", a6, b6); // 4, 6
// 取出一个整数的二进制形式中的指定位置的数字
// 比如 10 (00001010)
int a7 = 10;
// 取出10的二进制数中倒数第3位的数字(下标从第0为开始算)
int result = (a7>>3) & 1;
printf("result %d\n", result); //1
return 0;
}
输出如下:
a=5, b=9
a&b=1
a|b=13
a^b=12
~a=-6
b<<1=18
b>>1=4
b1=56
b2=12340078
b3=1234ff78
a4=0
b5=12345638
a6=4, b6=6
result 1