#include <stdio.h>
int main()
{
// 实际应用1:使用更高效率的移位运算,代替乘除法。
unsigned short var1 = 100;
printf("var<<4: %hu\n", var1<<4);
printf("var>>2: %hu\n", var1>>2);
// 实际应用2:对2进制数据拆分、组合。
var1 = 0x1234;
// 拆分 高8位:0x12 低8位:0x34
// 方法1:操作临界数(算术运算)
unsigned char var1_high8 = var1/0x0100;
unsigned char var1_low8 = var1%0x0100;
printf("1: high8:0x%hhX low8:0x%hhX\n", var1_high8, var1_low8);
// 方法2:(适用于16位、32位、64位数据)(推荐)
var1_high8 = (var1>>8)&0xFF;
var1_low8 = (var1>>0)&0xFF;
printf("2: high8:0x%hhX low8:0x%hhX\n", var1_high8, var1_low8);
// 组合 0x3412
// 方法1:算术加减
unsigned short var2 = (var1_low8<<8) + (var1_high8);
printf("var2: 0x%hX\n", var2);
// 方法2:位或|拼接(推荐)
var2 = var1_low8<<8 | var1_high8;
printf("var2: 0x%hX\n", var2);
// 对32位数据进行拆分组合
unsigned int var3 = 0x12345678;
unsigned char var3_1 = (var3>>24)&0xFF;
unsigned char var3_2 = (var3>>16)&0xFF;
unsigned char var3_3 = (var3>>8)&0xFF;
unsigned char var3_4 = (var3>>0)&0xFF;
printf("1:0x%hhX 2:0x%hhX 3:0x%hhX 4:0x%hhX\n", var3_1, var3_2, var3_3, var3_4);
unsigned int var4 = var3_4<<24 | var3_3<<16 | var3_2<<8 | var3_1<<0;
printf("var4: 0x%X\n", var4);
// 实际应用3:保留其他bit,对2进制数据的某个bit位置0/置1,或者翻转指定bit。
// 置1
unsigned char var5 = 0x56;
// 位序:7654 3210
// 0101 0110
// | 0010 0000 (1<<5)
// ---> 0111 0110
unsigned char var6 = var5|(1<<5);
printf("var6: 0x%hhX\n", var6);
// 置0
var5 = 0x56;
//位序: 7654 3210
// 0101 0110
// & 1111 1101 ~(1<<1)
// ---> 0101 0100
var6 = var5&(~(1<<1));
printf("var6: 0x%hhX\n", var6);
// 将0x56(0101 0110)第0/5/7位置1,第1/4/6位置0
var5 = 0x56;
// var5 = var5 |(1<<0)|(1<<5)|(1<<7);
var5 |= (1<<0)|(1<<5)|(1<<7); // 0xF7
printf("var5: 0x%hhX\n", var5);
//var5 = var5 & (~(1<<1)) & (~(1<<4)) & (~(1<<6));
var5 &= (~(1<<1)) & (~(1<<4)) & (~(1<<6)); // A5
printf("var5: 0x%hhX\n", var5);
// 翻转比特
var5 = 0x32;
//位序: 7654 3210
// 0001 0010
// ^ 0010 0000
// 0011 0010
//var5 = var5 ^ (1<<5);
var5 ^= 1<<5; // 将第5位翻转
printf("var5: 0x%hhX\n", var5);
return 0;
}