zoukankan      html  css  js  c++  java
  • 把一个给定的值存储到一个整数中指定的几个位《C与指针5.8.5》

    编写一个函数,把一个给定的值存储到一个整数中指定的几个位。它的原型如下:

    int store_bit_field(int original_value, int value_to_store,
            unsigned starting_bit, unsigned ending_bit);

    假定整数中的位是从右向左进行编号。因此,起始位的位置不会小于结束位的位置,为了更清楚的说明,函数应该返回下列值。

    原始值 需要储存的位 起始位 结束位 返回值
    0x0 0x1 4 4 0x10
    0xffff 0x123 15 4 0x123f
    0xffff 0x123 13 9 0xc7ff

    提示:把一个值存储到一个整数中指定的几个位分为5个步骤,以上表最后一行为例:

    1).创建一个掩码,它是一个值,其中需要存储的位置相对应的那几个位设置为1,此时掩码为

    00111110,00000000

    2).用掩码的反码对原值执行AND操作,将那几个位设置为0.原值1111111111111111,操作后变为

    11000001,11111111

    3).将新值左移,使它与需要存储的位对齐,新值00000001,00100011(0x123),左移后变为

    01000110,00000000

    4).把移位后的值与掩码进行位AND操作,确保除那几个需要存储的位之外的其余位都设置为0,进行这个操作之后,值变为

    00000110,00000000

    5).把结果值与原值进行位OR操作,结果为(0xc7ff)

    11000111,11111111

    在所有任务中,最困难的是创建掩码,你一开始可以把~0这个值强制转换为无符号值,然后再对它进行移位。

     1 #include <stdio.h>
     2 
     3 
     4 
     5 int store_bit_field(int original_value, int value_to_store,
     6 
     7                     unsigned starting_bit,unsigned ending_bit);
     8 
     9 
    10 
    11 int main(void)
    12 
    13 {
    14 
    15     printf("%x
    ",store_bit_field(0x0,0x1,4,4));
    16 
    17     printf("%x
    ",store_bit_field(0xffff,0x123,15,4));
    18 
    19     printf("%x
    ",store_bit_field(0xffff,0x123,13,9));
    20 
    21     return 0;
    22 
    23 }
    24 
    25 
    26 
    27 int store_bit_field(int original_value, int value_to_store,
    28 
    29                     unsigned starting_bit,unsigned ending_bit)
    30 
    31 {
    32 
    33     int value;
    34 
    35     int i = ending_bit;
    36 
    37     int unmask = 0;
    38 
    39     int mask = 0;
    40 
    41     int num = starting_bit - ending_bit + 1;
    42 
    43     while(num != 0){
    44 
    45         mask <<= 1;
    46 
    47         mask |= 1;
    48 
    49         num--;
    50 
    51     }
    52 
    53     while(i != 0){
    54 
    55         i--;
    56 
    57         mask <<= 1;
    58 
    59     }
    60 
    61     
    62 
    63     unmask = ~mask;
    64 
    65     original_value &= unmask;
    66 
    67 
    68 
    69     i = ending_bit;
    70 
    71     while(i != 0){
    72 
    73         i--;
    74 
    75         value_to_store <<= 1;
    76 
    77     }
    78 
    79 
    80 
    81     value = value_to_store & mask;
    82 
    83 
    84 
    85     value |= original_value;
    86 
    87     return value;
    88 
    89 }
  • 相关阅读:
    C#综合揭秘——细说事务
    软件项目管理流程总结
    WCF揭秘——自定义绑定
    WCF揭秘——共享数据契约
    反流程升职记
    .NET基础篇——利用泛型与反射更新实体(ADO.NET Entity Framework)
    先睹为快:Visual Studio 11测试版已于2.29在微软官方网站正式发布
    .NET基础篇——分部类和分部方法
    C#综合揭秘——深入分析委托与事件
    .NET基础篇——反射的奥妙
  • 原文地址:https://www.cnblogs.com/myohao/p/8497174.html
Copyright © 2011-2022 走看看