zoukankan      html  css  js  c++  java
  • 位运算应用之一——最低位为1的下标

    问题描述:

        输入一个整数,返回其二进制表示中最低的一位为1的下标值。

        很多CPU都在硬件层面直接提供该指令,例如,i386的BSF指令。但是,如果硬件没有提供该指令,又当如何。来看kernel中的算法

        应用分治思想进行依序判断.....

     1 int __ffs(int x)
     2 {
     3     int r = 0;          //r:用来标记下标,初始化为0。
     4     
     5     if (!x)
     6         return 0;
     7     if (!(x & 0xffff)) {     //即0 1111 1111 1111 1111
     8         x >>= 16;
     9         r += 16;
    10     }
    11     if (!(x & 0xff)) {      //即0 1111 1111
    12         x >>= 8;
    13         r += 8;
    14     }
    15     if (!(x & 0xf)) {       //即0 1111
    16         x >>= 4;
    17         r += 4;
    18     }
    19     if (!(x & 3)) {        //0x03————即0011
    20         x >>= 2;
    21         r += 2;
    22     }
    23     if (!(x & 1)) {        //0x01
    24         x >>= 1;
    25         r += 1;
    26     }
    27     return r;
    28 }

     附注:

     1 /*
     2 *描述:输入一个整数,返回其二进制表示中最低的一位为1的下标值。
     3 *分析:利用分治思想依序判断(移位判断)
     4 *BY: xymaqingxiang
     5 *Time:2014-05-01
     6 */
     7 #include <stdlib.h>
     8 #include <stdio.h>
     9 #include <windows.h>
    10 int ffs(int x)
    11 {
    12     int r = 0;//r:用来标记下标,初始化为0。
    13     
    14     if (!x)
    15         return 0;
    16     if (!(x & 0xffff)) {    //即0 1111 1111 1111 1111
    17         x >>= 16;
    18         r += 16;
    19     }
    20     if (!(x & 0xff)) {        //即0 1111 1111
    21         x >>= 8;
    22         r += 8;
    23     }
    24     if (!(x & 0xf)) {        //即0 1111
    25         x >>= 4;
    26         r += 4;
    27     }
    28     if (!(x & 3)) {        //0x03————即0011
    29         x >>= 2;
    30         r += 2;
    31     }
    32     if (!(x & 1)) {//0x01
    33         x >>= 1;
    34         r += 1;
    35     }
    36     return r;
    37 }
    38 
    39 void main()
    40 {
    41     int r;
    42     int x;
    43     printf("please input the x : 
    ");
    44     scanf("%d",&x);
    45     r=ffs(x);
    46     printf("%d",r);
    47     Sleep(100000);
    48 
    49 }
    具体代码实现
  • 相关阅读:
    2021牛客寒假算法基础集训营4 B. 武辰延的字符串(二分/Hash/exkmp)
    2021牛客寒假算法基础集训营4 H. 吴楚月的表达式
    2021牛客寒假算法基础集训营4 J. 邬澄瑶的公约数(GCD/唯一分解定理)
    leetcode 995. K 连续位的最小翻转次数(差分)
    robot 源码解读2【run.py执行流程】
    robot 源码解读1【代码量】
    python计算代码的行数
    为什么要用yield
    任意网站添加目录
    mac 定时执行脚本
  • 原文地址:https://www.cnblogs.com/xymqx/p/3702998.html
Copyright © 2011-2022 走看看