位运算符实际应用

简介: 位运算符实际应用
#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;
}
相关文章
|
3月前
|
消息中间件 Java 调度
深入探讨进程、线程和协程之间的区别和联系
本文深入解析进程、线程与协程的核心区别与联系,涵盖资源分配、调度机制、通信方式及性能对比。结合代码示例与实际场景,阐明三者在高并发系统中的协同应用,助你掌握现代并发编程设计精髓。(239字)
356 11
|
SQL Oracle 关系型数据库
Oracle分组取最大值
Oracle分组取最大值
|
JavaScript 搜索推荐 程序员
Vuepress + gitee五分钟免费搭建个人博客(保姆级教程)
前言 作为一个程序员,没有折腾过个人博客是不算完整的。技术文章的输出是我们程序员能力的一种体现,也是一种非常好的个人总结。 市面上有很多搭建个人博客的工具或框架,包括hexo、wordpress等等。不可否认,市面上有些博客系统做得很好,博客主题也很丰富,但是往往存在一个问题:比较重。 作为一个Vue程序员,我就比较推荐使用vuepress搭建个人博客,因为它毕竟是Vue出品的,大家熟知的vue官方就是利用vuepress搭建的。 本篇文章就从零开始教大家搭建一个免费的博客,零基础小白也可以学习哦!
4030 0
Vuepress + gitee五分钟免费搭建个人博客(保姆级教程)
|
Apache
基于commons-net实现ftp创建文件夹、上传、下载功能.
基于commons-net实现ftp创建文件夹、上传、下载功能.
417 0
|
缓存 负载均衡 安全
什么是CDN服务
CDN(内容分发网络)是全球分布的服务器网络,旨在加速互联网内容的传输。它通过将内容缓存至靠近用户的服务器,减少延迟,提升访问速度与性能,同时实现负载均衡、减轻源服务器压力并提供安全防护。广泛应用于网站加速、视频直播等领域,优化用户体验。
11502 5
面试官:除了继承Thread类和实现Runnable接口,你知道使用Callable接口的方式来创建线程吗?
面试官:除了继承Thread类和实现Runnable接口,你知道使用Callable接口的方式来创建线程吗?
150 0
面试官:除了继承Thread类和实现Runnable接口,你知道使用Callable接口的方式来创建线程吗?
|
Kubernetes 架构师 Java
史上最全对照表:大厂P6/P7/P8 职业技能 薪资水平 成长路线
40岁老架构师尼恩,专注于帮助读者提升技术能力和职业发展。其读者群中,多位成员成功获得知名互联网企业的面试机会。尼恩不仅提供系统化的面试准备指导,还特别针对谈薪酬环节给予专业建议,助力求职者在与HR谈判时更加自信。此外,尼恩还分享了阿里巴巴的职级体系,作为行业内广泛认可的标准,帮助读者更好地理解各职级的要求和发展路径。通过尼恩的技术圣经系列PDF,如《尼恩Java面试宝典》等,读者可以进一步提升自身技术实力,应对职场挑战。关注“技术自由圈”公众号,获取更多资源。
|
机器学习/深度学习 存储 算法
小样本问题
【10月更文挑战第1天
567 0
|
监控 Cloud Native 持续交付
云原生技术:构建现代应用的新范式
【10月更文挑战第9天】 随着云计算技术的不断成熟,云原生技术正迅速成为现代应用开发和部署的新标准。云原生不仅是一种技术,更是一种理念和实践方法,旨在最大化利用云计算的优势,提升应用的灵活性、可扩展性和弹性。本文将深入探讨云原生的核心概念、关键技术以及它如何改变我们构建和运行应用程序的方式。
288 0
|
Python
使用 os 模块更高效地读写文件
使用 os 模块更高效地读写文件
210 0