首页 > 代码库 > 反转一个值中的最后n位

反转一个值中的最后n位

  这是在《使用位运算显示二进制数》的基础上进一步扩展,实现反转一个值中最后n位,参数为n和要反转的值。

  ~可以一个字节中所有的位,而不是选定的少数位。为达到指定要求,需创建一个掩码,该掩码最后n位设为1,其余的位设为0。然后,对该掩码和一个值使用^运算就可以转置这个值得最后n位,同时保留该值的其他位不变。

  

 1 //使用位操作符来显示二进制并翻转该值的最后n位 2 #include<stdio.h> 3 char *itobs( int, char*);                //integer to binary string 4 void show_bstr( const char*);         5 int invert_end(int, int);                 //关键算法 6 main() 7 { 8     char bin_str[8 * sizeof(int) +1]; 9     int number;10     int n;11     while(scanf("%d", &number)==1)12     {13         itobs( number, bin_str);14         printf("%d is \n", number);15         show_bstr( bin_str);16         putchar(\n);17         puts("Enter an integer you want to invert:");18         scanf("%d", &n);19         number=invert_end(number, n);20         printf("%Inverting the last %d bits gives\n", n);21         show_bstr(itobs(number, bin_str));22         putchar(\n);23     }24 }25 char *itobs( int n, char *ps)26 {27     int i;28     static int size = 8 * sizeof(int);29     for( i=size-1; i>=0; i--, n>>=1)30         ps[i]=(1&n)+0;                   //01&n就是n的最后一位的值(1&n也行),该值为0或1。字符数组需要字符‘0‘或‘1‘,加上‘0‘的ASCII编码可以完成转换31     ps[size]=\0;32     return ps;33 }34 //四位一组显示二进制字符串35 void show_bstr(const char *str)36 {37     int i=0;38     while(str[i])39     {40         putchar(str[i]);41         if(++i%4==0  &&  str[i])42             putchar(  );43     }44 }45 int invert_end(int num, int bits)46 {47     int mask = 0;48     int bitval = 1;49     while( bits-->0)50     {51         //mask|=bitval;    52         //bitval<<=1;53         mask|=1;mask<<=1;         //若用注释语句,则需注释本句54     }55     mask>>=1;                        //若用注释语句,则需注释本句56     return num^mask;57 }

 

反转一个值中的最后n位