user-0 提问: 位数组  c和指针 第5章 第5道题

回复:
user: user-0
content: 感谢大家的解答，这是我结合大家的答案，和我的理解 ，搞清了这个输入到输出的过程： 以下是我的理解  和源代码的改动：  MASK1 4294967295 MASK2 4095 MASK3 65520 originl_value1 65535 originl_value2 15 value_to_store1 4656 0x123f #include <stdio.h> #include <limits.h> #define  INT_BITS     ( CHAR_BIT * sizeof( int ) )  int store_bit_field( int original_value, int value_to_store, unsigned starting_bit, unsigned ending_bit ) {     unsigned mask;      if( starting_bit < INT_BITS && ending_bit < INT_BITS &&starting_bit >= ending_bit ){  //      printf("%32d\n",INT_BITS); //      printf("%ld\n",mask);         mask = (unsigned)(-1);   //把～0强制转换为无符号值?????????         printf("MASK1 %ld\n",mask);         mask >>= INT_BITS - (starting_bit-ending_bit+1);         printf("MASK2 %ld\n",mask);         mask <<= ending_bit;         printf("MASK3 %ld\n",mask);          printf("originl_value1 %ld\n",original_value);                                      //以上为创建MASK         original_value &= ~mask;         printf("originl_value2 %ld\n",original_value);         value_to_store <<= ending_bit;         printf("value_to_store1 %ld\n",value_to_store);         original_value |= value_to_store & mask;              }      return original_value; } int main() {     printf("%d\n%d\n",INT_BITS,sizeof(int));     int m=store_bit_field(0xffff,0x123,15,4);     printf("0x%0x\n",m);     return 0; }

user: user-1
content: #include <stdio.h>  #define WIRTE_UINT(des ,x ,pos ,len)  (                                   \     (des)                                                                 \     &                                                                     \        ~(                                /* 除要修改的位为0，其余都为1 */ \             (                                                             \                 (1<<(len))-1             /* 长度为len位的1             */ \             )                                                             \             <<(32-(pos)-(len))           /* 左移32-(pos)-(len)位       */ \         )                                                                 \     |                                                                     \         (                                                                 \             (x)                                                           \             <<(32-(pos)-(len))                                            \         )                                                                 \ ) #define READ_UINT(src ,pos ,len)      (                                   \     (                                                                     \         (                                                                 \             (unsigned)(src)                                               \         )                                                                 \         >>(32-(pos)-(len))               /* 逻辑右移32-(pos)-(len)位   */ \     )                                                                     \     &                                                                     \     (                                                                     \         (1<<(len))-1                     /* 长度为len位的1             */ \     )                                                                     \ )  int main()                              //                1111111111222222222233 {                                       //bit   01234567890123456789012345678901     unsigned int des = 0x661;           //      00000000000000000000011001100001     unsigned int r;      des = WIRTE_UINT(des ,3 ,28 ,2);    //      00000000000000000000011001101101     printf("des==0x%08X\n",des); 	r =	READ_UINT(des ,28 ,2);     printf("r==%d\n",r);     return 0; } //des==0x0000066D //r==3

user: user-2
content: mask = (unsigned)(-1);  //意思是mask的类型能表达的最大的正整数，所有的二进制位都是1 假如mask的类型是32位正整数，那么这样做就是 0xFFFF。 写(unsigned)(-1) 比直接写 0xFFFF更好，因为不同编译器中，unsigned int的长度可能是不同的。  mask >>= INT_BITS - (starting_bit-ending_bit+1); //这是位操作，右移 你的例子里有大量的位操作，是可以在纸上一步步演算的。

user: user-3
content: -1在内存中的存储方式 原码 反码 补码

user: user-4
content: 自己根据位运算方法，在纸上推一下就懂了

user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-0
content: 大神给我讲解一下这个  mask是怎么生成的  也就是这个行代码的意思是什么 mask = (unsigned)(-1);   //把～0强制转换为无符号值????????? //      printf("%ld\n",mask);         mask >>= INT_BITS - (starting_bit-ending_bit+1);         mask <<= ending_bit;[code=c][/code] 你好  能具体讲一下这个掩码mask的生成原理吗  万分感谢