位操作应用示例

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
    //与1对应的二进制进行比较,&逻辑与,相同num加1
    //右移1位,再次比较
    //最终得到的num值为所求二进制数中1的个数
int Fun(int n)
{
    int num = 0;
    while(n)
    {
        num += n & 1;
        n = n >> 1;
    }
    return num;
}
int main()
{
    int n;
    printf("Please enter a number: ");
    scanf("%d", &n);
    getchar();
    printf("%d\n", Fun(n));
    getchar();
    return 0;
}

int Fun1(int n)//去掉最后一位
{
    return n >> 1;
}

int Fun2(int n)//在最后加一个0
{
    return n << 1;
}

int Fun3(int n)//在最后加一个1
{
    int num = n << 1;
     return num | 1;
}

int Fun4(int n)//把最后一位变成1
{
    int num = n | 1;
    return num;
}

int Fun5(int n)//把最后一位变成0
{
    int num = n | 1;
    return num-1;
}

int Fun6(int n)//最后一位取反
{
    int num1 = ~0 - 1;
    int num2 = n & num1;
    n = ~n & 1;
    return n+num2;
}

int Fun7(int n, int k)//把右数第k位变成1
{
    k = pow((double)2, k-1);
    n = n | k;
    return n;
}

int Fun8(int n, int k)//把右数第k位变成0
{
    k = pow((double)2, k-1);
    int num = ~(0 | k);
    return n&num;
}

int Fun9(int n, int k)//右数第k位取反
{
    k = pow((double)2, k-1);
    n = n ^ k;
    return n;
}

int Fun10(int n, int k)//取末三位//取末k位
{
    int num = 0;
    while(k >= 0)
    {
        num += pow((double)2, k-1);
        k--;
    }
    return n&num;
}


void Fun12(int n, int k)//取右数第k位
{
    k = pow((double)2, k-1);
    n = n&k;
    if(n == 0)
    {
        printf("0\n");
    }//k位为0
    else
    {
        printf("1\n");
    }//k位为1
}

int Fun13(int n)//把右数连续的1变成0
{
    int num = n;
    int num1;
    int flag = 0;//标记位(0为连续,1为不连续)
    int k = 0;
    while(num != 0)
    {
        num1 = num % 2;
        num = num / 2;
        if(num1== 1 && num%2 == 1 && flag == 0)
        {
            k++;
        }
        else
        {
            flag = 1;
        }
    }
    int num2 = 0;
    while(k >= 0)
    {
        num2 += pow((double)2, k);
        k--;
    }
    return n^num2;
}

int Fun14(int n)//把右边第一个0变成1
{
    int num = n;
    int k = 0;
    int flag = 0;
    while(num != 0 && flag == 0)
    {
        if(num % 2 == 1)
        {
            k++;
        }
        else
        {
            k++;
            flag = 1;
        }
        num = num / 2;
    }
    num = pow((double)2, k-1);
    return n|num;
}

int Fun15(int n)//把右边连续的0变成1
{
    int num = n;
    int num1;
    int num2 = 0;//标记位(0为连续,1为不连续)
    int k = 0;
    while(num != 0)
    {
        num1 = num % 2;
        num = num / 2;
        if(num1== 0 && num%2 == 0 && num2 == 0)
        {
            k++;
        }
        else
        {
            num2 = 1;
        }
    }
    int num3 = 0;
    while(k >= 0)
    {
        num3 += pow((double)2, k);
        k--;
    }
    return n|num3;
}

void itoa_n(int n)//十进制数转二进制数
{
    char str[30];
    itoa(n, str, 2);
    printf("%s\n", str);
}

int main()
{
    unsigned int n;
    printf("Please enter a number: ");
    scanf("%d", &n);
    getchar();
    //itoa_n(Fun1(n));
    //itoa_n(Fun2(n));
    //itoa_n(Fun3(n));
    //itoa_n(Fun4(n));
    //itoa_n(Fun5(n));
    //itoa_n(Fun6(n));
    //itoa_n(Fun7(n, 3));
    //itoa_n(Fun8(n, 3));
    //itoa_n(Fun9(n, 3));
    //itoa_n(Fun10(n, 3));
    //Fun12(n, 3);
    //itoa_n(Fun13(n));
    itoa_n(Fun14(n));
    //itoa_n(Fun15(n));

    getchar();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39191122/article/details/80043087
今日推荐