用C位设置 [英] Setting Bits in C

查看:122
本文介绍了用C位设置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图做到以下几点:


  

写FUNC setbits(X,PN,Y)返回 X ñ即开始在位
  位置 P 设置为最右侧的 N 位,而使其它位
  不变?


我试过这样,但没有得到正确的答案。谁能告诉我在哪里错了?

 符号setbits(无符号X,INT P,诠释N,无符号Y)
{
    则返回(x>指p及(Y |(〜0℃;&下; N)));
}


解决方案

是这样的:

 符号setbits(无符号X,INT P,诠释N,无符号Y)
{
    无符号的面具=(1U<< N) - 1U; // n位
    Y'放大器; =口罩;成Y //最右边的n位
    Y'LT;< = P; //它开始于位置p
    面膜<< = P; //同上
    X'放大器; =〜口罩; //设置0
    X | = Y; //设置1秒
    返回X;
}

或者,如果你想这样做更少的线,更难以调试,但waaaay冷却器:

 符号setbits(无符号X,INT P,诠释N,无符号Y)
{
    无符号的面具=(1U<< N) - 1U; // n位
    返回(X安培;〜(面膜<< P))| ((Y&放大器;掩模)所述;&下,P);
}

I'm trying to do the following:

Write a func setbits(x,p.n,y) that returns x with n bits that begin at position p set to the rightmost n bits of y,leaving the other bits unchanged?

I tried it like this but not getting correct answers. Can anyone tell where I am wrong?

unsigned setbits(unsigned x,int p,int n,unsigned y)
{
    return (x>>p & (y|(~0<<n)));
}

解决方案

Something like:

unsigned setbits(unsigned x,int p,int n,unsigned y)
{
    unsigned mask = (1U << n) - 1U; // n-bits
    y &= mask; // rightmost n bits of y
    y <<= p;   // which begin at position p
    mask <<= p; //idem
    x &= ~mask; //set the 0s
    x |= y;     //set the 1s
    return x;
}

Or if you want to do it in fewer lines, more difficult to debug, but waaaay cooler:

unsigned setbits(unsigned x,int p,int n,unsigned y)
{
    unsigned mask = (1U << n) - 1U; // n-bits
    return (x & ~(mask << p)) | ((y & mask) << p);
}

这篇关于用C位设置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆