zoukankan      html  css  js  c++  java
  • 从“int中提取高八位”开始的学习

    今天有个学弟问了一个问题,怎么提取int中的高八位。

    这个是个非常基础的问题,随便用位运算瞎搞几下就出来了。

    看到这个问题的时候,也不知道我当初想了些啥,想了个骚操作,用memcpy把int放到字符串里。。承认吧,你就是个毒瘤。ヾ(・ω・`。) 

    实现方法如下

    #include <cstdio>
    #include <cstring>
    int main(){
        int a = 0xaabbccff;
        char ch[4];
        memcpy(ch, &a, 4); 
        for(int i = 0; i < 4; 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 0;
    }  

    但是我跟学弟说的取高八位直接取ch[0],从输出结果看,我的答案应该是错的,一下子没有想通为什么。

    后面才知道是字节序。仿佛触及到了我的知识盲区了(你本来就是个什么都不懂的菜鸡),就去查了一下。

    其实总共就下面几句话:

    计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。

    大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。

    小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。

    计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。

    举个例子

    #include <cstdio>
    #include <cstring>
    int main(){
        int a = 0xaabbccdd;
        char c;
        c = a;
        printf("%#x
    ", 0xff&c);
        /* OUTPUT:
           0xdd
        */    
    }  

    但是有些cpu并不是严格按照小端字节序进行处理数据的,所以,我这个毒瘤方法虽然可以提取出每个字节的值,但是在不同机器上取值的下标可能不一样,所以并不能适用。

  • 相关阅读:
    I.MX6 Surfaceflinger 机制
    理解 Android Fragment
    RPi 2B DDNS 动态域名
    RPi 2B IPC webcam server
    理解 Android MVP 开发模式
    I.MX6 system.img unpack repack
    can't set android permissions
    VMware Ubuntu 共享文件夹
    解决oracle数据库连接不上的问题
    perfect-scrollbar示例
  • 原文地址:https://www.cnblogs.com/HDMaxfun/p/11408392.html
Copyright © 2011-2022 走看看