位运算符实际应用

简介: 位运算符实际应用
#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;
}


#include <stdio.h>
int main()
{
  // 位逻辑反~
  char var1 = 0x3A;
  char var2 = ~var1;
  printf("~var1: 0x%hhX\n", var2);
  // 位逻辑与&
  var1 = 0x3A;      // 0011 1010
  var2 = 0x75;      // 0111 0101
  char var3 = var1&var2; //& 0011 0000  --> 0x30
  printf("var1&var2: 0x%hhX\n", var3);
  // 位逻辑或|
  var1 = 0x5C;    // 0101 1100
  var2 = 0x7D;    // 0111 1101
  var3 = var1|var2; // | 0111 1101  --> 0x7D
  printf("var1|var2: 0x%hhX\n", var3);
  // 位逻辑异或^
  var1 = 0xB4;    // 1011 0100
  var2 = 0x6D;    // 0110 1101
  var3 = var1^var2; // ^ 1101 1001  --> 0xD9
  printf("var1^var2: 0x%hhX\n", var3);
  // 左移 <<
  unsigned short var4 = 0x1234;
  unsigned short var5 = var4<<4;
  printf("var4<<4: 0x%hX\n", var5);
  // 右移 >>
  var4 = 0x1234;
  var5 = var4>>4;
  printf("var4>>4: 0x%04hX\n", var5);
  return 0;
}
相关文章
|
6月前
|
C语言
基本的算术运算符
基本的算术运算符
67 1
|
1月前
|
Shell Perl
算术运算符
【10月更文挑战第16天】
19 3
|
6月前
|
C++
C++程序中的算术运算符
C++程序中的算术运算符
64 2
|
4月前
|
存储 算法 安全
day10:算术运算符
【7月更文挑战第10天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
29 3
|
4月前
|
搜索推荐 安全 Java
day11:关系运算符
【7月更文挑战第11天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
31 2
|
5月前
|
Python
位运算符
【6月更文挑战第28天】位运算符。
34 1
|
5月前
|
存储 编译器 C++
C++中的位运算符
C++中的位运算符
27 0
|
6月前
|
C++
c++关系运算符
c++关系运算符
40 1
|
6月前
|
编译器 C++
c++算术运算符
c++算术运算符
37 0
|
6月前
|
存储
位运算符和位操作符
位运算符和位操作符
31 0