【C语言】经验漫谈:应用情景下的移位操作巧分析

news/2025/2/25 7:01:10/

目录

1.下面代码中if判断是什么含义,请分析

方法:枚举num的所有可能,看看判断的真假

代码

下面to_int32函数的作用是什么,请分析

方法:尝试一些数字去打印函数的返回值

代码


本文讲解枚举法和特值法

1.下面代码中if判断是什么含义,请分析

来自某修改器的逆向出的代码的一部分:

//num为unsigned int类型
if (num <= 12)
{if (((num - 8) & 0xFFFFFFFB) != 0){// do_something}
}

方法:枚举num的所有可能,看看判断的真假

枚举num的所有可能:循环

判断的真假的模版:

if ()
{printf("true");
}
else
{printf("false");
}

代码

因为num为unsigned int类型,因此从0枚举到12,打印每一种情况的真假

#include <stdio.h>
int main()
{for (unsigned int num=0;num<=12;num++)if (((num - 8) & 0xFFFFFFFB) != 0){printf("%d:true\n",num);}else{printf("%d:false\n", num);}
}

运行结果:

由运行结果可以看出:if判断等价为:

	if (num != 8 && num != 12){//do_something}

如果unsigned int类型的num没有规定范围,可以对所有值判断,代码如下

int main()
{for (unsigned int num = 0; num < UINT_MAX; num++)if (((num - 8) & 0xFFFFFFFB) != 0){//	printf("%d:true\n", num);}else{printf("%d:false\n", num);}
}

运行结果

下面to_int32函数的作用是什么,请分析

源代码片段来自https://github.com/pod32g/MD5/blob/master/md5.c 

摘自MD5算法的源文件的一部分:

uint32_t to_int32(const uint8_t* bytes)
{return (uint32_t)bytes[0]| ((uint32_t)bytes[1] << 8)| ((uint32_t)bytes[2] << 16)| ((uint32_t)bytes[3] << 24);
}

方法:尝试一些数字去打印函数的返回值

例如使用存有特定值的类型为uint8_t数组

代码

int main()
{uint8_t bytes[] = { 1, 2, 3, 4 };printf("%u",to_int32(bytes));
}

{ 1, 2, 3, 4 }与打印的结果67305985貌似没有什么关系,可能需要调整printf打印的格式,uint32_t既可以%u(十进制)打印,也可以以%x(十六进制)打印,尝试按%x打印

int main()
{uint8_t bytes[] = { 1, 2, 3, 4 };printf("%x",to_int32(bytes));
}

运行结果:

好像看出规律了,如下图所示:

可以推出to_int32函数的的等价写法如下,但没有原来的写法快

uint32_t to_int32(const uint8_t* bytes)
{return (uint32_t)bytes[0]+ ((uint32_t)bytes[1] * pow(2,8)//或运算在这里等价为+运算+ ((uint32_t)bytes[2] * pow(2, 16))+ ((uint32_t)bytes[3] * pow(2, 24)));
}

因此to_int32函数的作用:将一个类型为uint8_t的数组的四个元素转换为一个32位整数


http://www.ppmy.cn/news/1574789.html

相关文章

供应链金融的学习梳理

一、采购供应链 采购供应链是企业供应链管理的起点&#xff0c;其主要目标是确保原材料和零部件的供应质量和效率&#xff0c;同时降低采购成本。在这个环节中&#xff0c;供应商关系管理系统&#xff08;SRM&#xff09;和电子采购系统&#xff08;EPS&#xff09;是两个关键…

【Linux】重定向与缓冲区

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.文件属性获取struct stat 结构体 02.重定向dup2 系统调用缓冲区的理解C 语言 stdio 的缓冲区&#xff08;2&#xff09;stdout 的 3 种缓冲模式 内核缓冲区&#xff08;Page C…

从零开始构建基于DeepSeek的智能客服系统

在当今的数字化时代,智能客服系统已经成为企业与客户沟通的重要桥梁。它不仅能够提升客户体验,还能大幅降低企业的运营成本。本文将带领你从零开始,使用PHP和DeepSeek技术构建一个功能强大的智能客服系统。我们将通过具体的案例和代码示例,深入探讨如何实现这一目标。 1. …

如何安装vm和centos

安装 VMware Workstation Pro 步骤 1&#xff1a;下载 VMware Workstation Pro 访问 VMware 官方网站&#xff08;Desktop Hypervisor Solutions | VMware &#xff09;&#xff0c;根据你的操作系统选择合适的版本进行下载。 步骤 2&#xff1a;运行安装程序 找到下载的安装…

注意力机制深度优化

###一、注意力机制深度优化 1.FlashAttentionV3(2024最新版) # 安装最新版&#xff08;需H100/A100 GPU&#xff09; pip install flash-attn3.0.0 --no-build-isolation# 启用FP8混合精度&#xff08;需H100&#xff09; model AutoModelForCausalLM.from_pretrained("…

hot100-二叉树

二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…

奇异值分解(SVD)拟合平面

奇异值分解&#xff08;SVD&#xff09;拟合平面 在三维空间中&#xff0c;使用奇异值分解&#xff08;SVD&#xff09;来拟合平面是一种常见且有效的方法。下面将详细介绍其原理、实现步骤&#xff0c;并给出Python代码示例。 原理 给定一组三维空间中的点 P { p 1 , p 2…

从Majorana 1芯片看微软量子计算路径及竞品对比分析

一、引言 1.1 研究背景与意义 在科技飞速发展的当下,量子计算已成为全球瞩目的前沿领域,被视为引领未来科技变革的关键力量。量子计算利用量子比特的叠加和纠缠等量子特性,能够实现远超传统计算机的计算能力,在解决复杂科学问题、优化算法以及推动多领域创新等方面展现出…