c语言:取整型变量x中的第p位开始的n个bit位。求解析过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言:取整型变量x中的第p位开始的n个bit位。求解析过程相关的知识,希望对你有一定的参考价值。

c语言:取整型变量x中的第p位开始的n个bit位,可以采用位运算的方法。先向左移位,丢弃前面不需要的位,再通过向后移位,丢弃后面不需要的位,最后再向左移位到原来的位置,就可以了。

1//num&(num-1)=(1111)&(1110)=(1110)    

2//num&(num-1)=(1110)&(1101)=(1100)   

3//num&(num-1)=(1100)&(1011)=(1000)   

4//num&(num-1)=(1000)&(0111)=0  ,循环停止。共执行4次while循环。


扩展资料

一、指定的某一位数置1

宏 #define setbit(x,y)  x|=(1<<y)

二、指定的某一位数置0

宏  #define clrbit(x,y)  x&=~(1<<y)

三、指定的某一位数取反

宏  #define reversebit(x,y)  x^=(1<<y)

四、获取的某一位的值

宏 #define getbit(x,y)   ((x) >> (y)&1)

参考技术A c语言:取整型变量x中的第p位开始的n个bit位,可以采用位运算的方法。
先向左移位,丢弃前面不需要的位,再通过向后移位,丢弃后面不需要的位,最后再向左移位到原来的位置,就可以了。

[SDOI2006] 二进制方程

并查集水题。维护变量的对应位的相关关系,判断不确定点(自由元)的个数即可。
代码中的p数组:p[1] 值的id, p[2~k+1]每个变量的第一位的id。

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+7;

int n,m,k,tot;
int p[N],fa[N],x[N],y[N];

int get(int x) {return fa[x]==x? x: fa[x]=get(fa[x]);}

int main() {
    p[1]=2; 
    scanf("%d",&k);
    for(int i=2,x; i<=k+1; ++i) {
        scanf("%d",&x);
        p[i]=p[i-1]+x;
        tot+=x;
    }
    
    static char str[N];
    scanf("%s",str);
    for(int i=0; str[i]; ++i) {
        if(isalpha(str[i])) {
            int c=str[i]-'a'+1;
            for(int j=p[c]; j<p[c+1]; ++j) x[++n]=j;
        } else x[++n]=str[i]-'0';
    }
    scanf("%s",str);
    for(int i=0; str[i]; ++i) {
        if(isalpha(str[i])) {
            int c=str[i]-'a'+1;
            for(int j=p[c]; j<p[c+1]; ++j) y[++m]=j;
        } else y[++m]=str[i]-'0';
    }
    
    if(n!=m) {
        puts("0");
        return 0;
    }
    for(int i=1; i<N; ++i) fa[i]=i;
    for(int i=1; i<=n; ++i) {
        int dx=get(x[i]), dy=get(y[i]);
        if(dx+dy==1) {
            puts("0");
            return 0;
        }
        if(dx!=dy) {
            fa[max(dx,dy)]=min(dx,dy);
            tot--;
        }
    }
    
    static int dig[N]={1},top=1;
    while(tot--) {
        for(int i=0; i<top; ++i) dig[i]<<=1;
        for(int i=0; i<top; ++i) if(dig[i]>=10) {
            dig[i+1]+=dig[i]/10, dig[i]%=10;
        }
        for(; dig[top]; ++top) {
            dig[top+1]+=dig[top]/10, dig[top]%=10;
        }
    }
    for(int i=top-1; ~i; --i) printf("%d",dig[i]);
    return 0;
}

以下为输入格式:

第一行:k(k<=26,变量的个数,规定使用小写英文字母中的前k个字母作为变量,如k=5,则变量a,b,c,d,e)。
第二行:k个正整数,中间用一个空格隔开,依次代表k个变量的长度。
第三行:等式左边的表达式。
第四行:等式右边的表达式。

以上是关于c语言:取整型变量x中的第p位开始的n个bit位。求解析过程的主要内容,如果未能解决你的问题,请参考以下文章

《C程序设计语言》 练习2-6 及 位运算总结

《C程序设计语言》 练习2-6 及 位运算总结

用c语言实现大整形运算,64位长整型的加减法,输入限制为64位长度整数

C语言位运算的应用如何按bit位翻转一个无符号整型

C语言,键盘输入一个2位以上的任意数,输出这个数的第m位开始,到第n位结束的数。

c语言中输出如何保留x位小数,注意x是变量