2个小编程题(字节多少位为1,判断LSB or MSB)

来源:互联网 发布:拼团网源码 编辑:程序博客网 时间:2024/04/28 04:12


1计算一个字节里有多少个bit被置1,多少位被置换为0:

  int chek_byte_1(char x)    {      int i,count_1=0;      for(i=0;i<8;i++)      {          if(((x>>i)&1)==1)              count_1++;      }      return count_1;  }  int chek_byte_0(char x)    {      int i,count_0=0;      for(i=0;i<8;i++)      {          if(((x>>i)&1)==0)              count_0++;      }      return count_0;  }

*if( ( (x>>i) &1)==1)  这里我们需要判断优先级的时候最好是多加个括号,这样谁都看得懂了,其实&有2个意思,一个是取地址,一个是位运算,这里是取地址是比==低的,所以我们需要打上括号


  void main() {      char num=16;      printf("%d has bit 1= %d,bit 0=%d \n",num,chek_byte_1(num),chek_byte_0(num));   }




2. 写一个函数,判断是小端字节序(LSB)还是大端字节序(MSB);

#include <stdio.h>  int main()  {        int test = 1;        if(*(char *)&test)            printf("Little endian byte order!\n");        else            printf("Big endian byte order!\n");        return 0;  }


解释一下(*(char *)&test):首先看到这句,应该从test开始着手,取整形变量test的地址&test,再将此地址强制类型转换成字符指针类型(char *)&test,那么读取这个地址的时候就只读取一字节的内存块数据,即之前的四字节整型内存块被截断,且这一字节的地址在这四字节中就是最低地址,最后取这一字节内存块的数据*(char *)&test。如果是Little endian,则保存1的那一位必定在这一字节中而且用%d打印出来的值也是1。如果是Big endian,则保存1的那一位必定不在这一字节中而且这一字节中的每位都是0,用%d打印出来必定是0



0 0
原创粉丝点击