从“int中提取高八位”开始的学习
2024-09-05 13:58:24
今天有个学弟问了一个问题,怎么提取int中的高八位。
这个是个非常基础的问题,随便用位运算瞎搞几下就出来了。
看到这个问题的时候,也不知道我当初想了些啥,想了个骚操作,用memcpy把int放到字符串里。。承认吧,你就是个毒瘤。ヾ(・ω・`。)
实现方法如下
#include <cstdio>
#include <cstring>
int main(){
int a = 0xaabbccff;
char ch[];
memcpy(ch, &a, );
for(int i = ; i < ; i++){
printf("ch[%d]=%#x ", i, 0xff & ch[i]);
/* %x会强制转换ch[i]为int类型,如果第一个字节为1会前补1,所以只取低八位即可 */
/* OUTPUT :
ch[0]=0xff ch[1]=0xcc ch[2]=0xbb ch[3]=0xaa
*/
}
return ;
}
但是我跟学弟说的取高八位直接取ch[0],从输出结果看,我的答案应该是错的,一下子没有想通为什么。
后面才知道是字节序。仿佛触及到了我的知识盲区了(你本来就是个什么都不懂的菜鸡),就去查了一下。
其实总共就下面几句话:
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。
大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。
计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。
举个例子
#include <cstdio>
#include <cstring>
int main(){
int a = 0xaabbccdd;
char c;
c = a;
printf("%#x\n", 0xff&c);
/* OUTPUT:
0xdd
*/
}
但是有些cpu并不是严格按照小端字节序进行处理数据的,所以,我这个毒瘤方法虽然可以提取出每个字节的值,但是在不同机器上取值的下标可能不一样,所以并不能适用。
最新文章
- chrome中hack解决input:-webkit-autofill自定义样式
- 获取Mac地址
- LeetCode - 49. Group Anagrams
- iOS开发之音频口通信-通过方波来收发数据
- 微信多媒体上传图片,创建卡券上传 LOGO
- H3C S5000和H3C S5500,俺来罗
- python处理mysql慢查询日志
- 用Doxygen生成文档
- Private Members in JavaScript
- Spring HTTP invoker 入门
- css两列布局,一边固定宽度,另一边自适应
- 把HTML5网页封装成APP,APK的方法
- session深入解读
- vs2012中程序集生成无法自动在网站Bin目录下生成Dll文件?(已解决!)
- js中非死循环引起的栈调用溢出问题
- MinerDB.java 数据库工具类
- 【原创】qlogic网卡软中断不均衡问题分析
- JS与CSS阻止元素被选中及清除选中的方法总结
- python - format函数 /class内置format方法
- C#基础第三天-作业答案-集合-冒泡排序-模拟名片