您的位置:首页 > 编程语言

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

2015-09-18 21:53 281 查看
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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: