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 }
  • 相关阅读:
    HDU 1874 畅通工程续(dijkstra)
    HDU 2112 HDU Today (map函数,dijkstra最短路径)
    HDU 2680 Choose the best route(dijkstra)
    HDU 2066 一个人的旅行(最短路径,dijkstra)
    关于测评机,编译器,我有些话想说
    测评机的优化问题 时间控制
    CF Round410 D. Mike and distribution
    数字三角形2 (取模)
    CF Round410 C. Mike and gcd problem
    CF Round 423 D. High Load 星图(最优最简构建)
  • 原文地址:https://www.cnblogs.com/myohao/p/8497174.html
Copyright © 2011-2022 走看看