zoukankan      html  css  js  c++  java
  • 反转一个值中的最后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 
    ", number);
    15         show_bstr( bin_str);
    16         putchar('
    ');
    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);
    21         show_bstr(itobs(number, bin_str));
    22         putchar('
    ');
    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]='';
    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 }
  • 相关阅读:
    Metinfo 5.x 管理员密码重置漏洞
    【CVE-2018-11116】openwrt rpcd 配置文件错误导致访问控制失效
    openwrt-rpcd服务ACL配置错误风险分析
    黑客基础知识
    渗透测试(漏洞利用)
    Niagara物联网框架机制二(笔记)
    基于kali linux无线网络渗透测试
    渗透测试(漏洞扫描)
    Workbench热水泵系统
    Niagara物联网框架机制一(笔记)
  • 原文地址:https://www.cnblogs.com/anthozoan77/p/4070041.html
Copyright © 2011-2022 走看看