前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >位运算符实际应用

位运算符实际应用

作者头像
天天Lotay
发布于 2022-12-02 06:36:12
发布于 2022-12-02 06:36:12
20800
代码可运行
举报
文章被收录于专栏:嵌入式音视频嵌入式音视频
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
嵌入式day3学习(2022.1.8)
1、编写一个程序,此程序要求输入一个整数,然后打印出从输入的值(含)到比输入的值大 10(含)的所有整数值(比如输入 5,则输出 5 到 15)。要求在各个输出值之间用空格、制表符或者换行符分开。
天天Lotay
2022/12/02
2550
嵌入式day3学习(2022.1.8)
Java源码学习之:UUID
作为开发人员大家对UUID应该都比较熟悉了,Java中也提供了相关的类和生成方法,供业务中使用。这里准备对UUID生成的过程做一次深入了解。
程序员架构进阶
2022/01/18
1.7K0
Java源码学习之:UUID
socket-io的底层实现设计原理
上一篇文章 《漫谈socket-io的基本原理》 用了现实非常浅显的例子,尽可能地阐释非阻塞、阻塞、多线程、多路复用poll和 epoll 背后演进的整体思考脉络,将有助于读者从宏观的角度把握住socket-io的本质。 本文将聚焦在JDK socket-io 的多路复用 poll/epoll 的实现原理,可能比较枯燥复杂,为了降低理解成本,作者尽可能循序渐进,控制每个步骤的信息量。
亦山
2021/04/22
9390
Java7的try-with-resources声明(转)
看《Effective Java》第三版的时候,看到了其中建议将try-finally替换为try-with-resources。这个语法糖还算有意思,特此成文。
会说话的丶猫
2020/08/25
5570
ReentrantLock原理分析
ReentrantLock是Java并发包中提供的一个可重入的互斥锁,它拥有与synchronized相同的作用,但却比synchronized有更好的性能,在许多高并发编程中都会用到它。由于大部分同学都只停留在了API调用的层次,对ReentrantLock的原理一知半解,甚至一无所知,因此写下了这篇文章,让同学们真正的把ReentrantLock给拿下!
小瑾守护线程
2021/01/17
5560
ReentrantLock原理分析
7种python位运算符举例
位运算这个概念大家可能比较陌生,一般的数学运算中是看不到类似的概念的,所以本课内容有些抽象,但是位运算在python应用层开发中运用的不多,一般与底层开发关系比较密切。所谓位运算指的是计算机按照数据在内存中的二进制位进行的运算操作。Python 位运算符只能用来操作整数类型,它按照整数在内存中的二进制形式进行计算。本章内容看不懂的可以直接跳过。
python自学网
2021/11/29
1.2K0
7种python位运算符举例
帆软/view/ReportServer 远程代码执行漏洞分析
漏洞描述: FinеRероrt 是帆软自主研发的企业级 Wеb 报表工具。其/view/ReportServer接口存在模版注入漏洞,攻击者可以利用该漏洞执行任意SQL写入Webshell,从而获取服务器权限。 影响范围: 1)JAR包时间在 2024-07-23 之前的FineReport11.*、10.*系列 2)JAR包时间在 2024-07-24 之前的、运维平台或Tomcat部署包部署的FineBI全版本 3)JAR包时间在 2024-07-24 之前的FineDataLink全版本
Al1ex
2024/08/09
1.9K0
帆软/view/ReportServer 远程代码执行漏洞分析
并发编程之CAS(Compare and Swap)原理Unsafe类
AQS,非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类),这些concurrent包中的基础类都是使用这种模式来实现的,而concurrent包中的高层类又是依赖于这些基础类来实现的。从整体来看,concurrent包的实现示意图如下:
一个会写诗的程序员
2018/08/20
1K0
并发编程之CAS(Compare and Swap)原理Unsafe类
你不知道的 equals 和 ==
i1 == i2 和 i1.equals(i2) 这两个都是 true,大多数人应该可以答对。后面的 i3 == i4 和 i3.equals(i4) 估计就有不少人搞不清了。
Wizey
2018/08/30
5080
Java NIO通道概览与文件通道【源码笔记】
系统I/O即字节的传输,Channel即传输的通道,文件或网络Socket服务即传输的目的地。
瓜农老梁
2020/02/18
2.5K0
Java NIO通道概览与文件通道【源码笔记】
51单片机4种流水灯
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132933.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/14
9100
Unsafe 源码分析
Unsafe 是用于在实质上扩展 Java 语言表达能力、便于在 Java 代码里实现原本要在 C 层实现的核心库功能用的。这些功能包括裸内存的申请、释放、访问,低层硬件的 atomic/volatile 支持,创建未初始化对象等。但由于 Unsafe 类使 Java 语言拥有不应该暴露的骚操作,增加了程序出问题的风险。
itliusir
2020/01/31
9550
模型转代码:XGBoost等模型也能快速转纯C或Java代码
那么转化为 Java/Python/C 源代码有什么用呢?想象一下如果我们使用 ML 框架(scikit-learn\XGBoost\LightGBM)训练了一个模型,现在我们希望把这个模型做成应用或嵌入到已有的模型中,那么我们肯定需要考虑这些问题:
机器之心
2019/03/15
1.9K0
模型转代码:XGBoost等模型也能快速转纯C或Java代码
算法与编程之 -- IO流
编写一个程序,将 a.txt 文件中的单词与 b.txt 文件中的单词交替合并到 c.txt文件中,a.txt 文件中的单词用回车符分隔,b.txt 文件中用回车或空格进行分隔。
Java深度编程
2020/06/10
3250
记一次有意思的种树比赛
在招聘群里有位老哥发了个网址http://geek.qq.com/tree/,发现挺好玩,别说这玩意还真让人极其上头哈哈,这次种树实际上就是类似于一个闯关游戏,种树种到一定数量就会出现新的玩法,当然我也是个小菜鸡,弄了100w就种不下去了,在我玩的这几关就需要解密混淆的js等等一些操作,还是挺好玩的,注意这边是成功种一棵树后才能继续种下一棵树,因此开多线程并行刷接口没有意义。
WindRunnerMax
2021/03/16
2320
说说kotlin的内联函数-inline
作用:它们的函数体在编译器被嵌入每一个被调用的地方,减少额外生成匿名类和执行函数的开销
韦东锏
2021/09/29
9880
ASCII码表_ASCII码对照表
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。 ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。其中: 0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符)如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。 65~90为26个大写英文字母, 97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
张旭博客
2022/12/27
1.8K0
反射真的慢么?动态代理会创建很多临时class?
当我们在IDE中编写代码的时候,打一个点号,IDE会自动弹出对应的属性和方法名,当我们在debug的时候,IDE会将方法运行时方法内局部变量和外部实例上属性的值都展示出来,spring中的IOC和AOP,以及一个RPC框架中,我们反序列化,consumer的代理,以及provider的调用都会用到java的反射功能,有人说使用反射会慢,那么到底慢在哪里呢?
苏先生
2019/04/29
1.3K0
反射真的慢么?动态代理会创建很多临时class?
致远OA A8 HtmlOfficeServlet前台GetShell 分析
在web.xml下存在这么三个servlet,这三个servlet都是未授权的,其中我们重点关注下HtmlOfficeServlet
黑伞安全
2021/04/23
4.1K0
深入理解JDK动态代理机制
基于JDK8 Java中代理的实现一般分为三种 JDK静态代理 JDK动态代理 CGLIB动态代理 在Spring的AOP实现中,主要应用了JDK动态代理以及CGLIB动态代理。本文讨论关于JDK动态代理机制。 代理一般实现的模式为JDK静态代理:创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。 其实就是代理类为被代类预处理消息、过滤消息并在此之后将消息转发给被代类,之
JavaEdge
2018/05/16
6930
相关推荐
嵌入式day3学习(2022.1.8)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文