在128位的数目按位移位操作 [英] Bitwise shift operation on a 128-bit number

查看:161
本文介绍了在128位的数目按位移位操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

比方说,我有4个32位整数数组,我用它来存储128位的数字。

我怎么能离开执行,并在此128位数字右移?

谢谢!


解决方案

 无效shiftl128(
    unsigned int类型和放大器;一个,
    unsigned int类型和放大器; b,
    unsigned int类型和放大器; C,
    unsigned int类型和放大器; D,
    为size_t K)
{
    断言(K< = 128);
    如果(K> = 32)//超过31位的移位32位整数是不确定
    {
        A = B;
        B = C;
        C = D组;
        D = 0;
        shiftl128(A,B,C,D,K-32);
    }
    其他
    {
        A =(A<< K)| (B个;>(32-k))的;
        B =(B<< K)| (c取代;>(32-k))的;
        C =(C<< K)| (d取代;>(32-k))的;
        D =(D<< K);
    }
}无效shiftr128(
    unsigned int类型和放大器;一个,
    unsigned int类型和放大器; b,
    unsigned int类型和放大器; C,
    unsigned int类型和放大器; D,
    为size_t K)
{
    断言(K< = 128);
    如果(K> = 32)//超过31位的移位32位整数是不确定
    {
        D = C:
        C = B:
        B = A;
        一个= 0;
        shiftr128(A,B,C,D,K-32);
    }
    其他
    {
        D =(℃下≤(32-K))| (D>> K); \\
        C =(B&所述;≤(32-K))| (C>> K); \\
        B =(A&所述;≤(32-K))| (B>> K); \\
        A =(A>> K);
    }
}

Lets say that I have an array of 4 32-bit integers which I use to store the 128-bit number

How can I perform left and right shift on this 128-bit number?

Thanks!

解决方案

void shiftl128 (
    unsigned int& a,
    unsigned int& b,
    unsigned int& c,
    unsigned int& d,
    size_t k)
{
    assert (k <= 128);
    if (k >= 32) // shifting a 32-bit integer by more than 31 bits is "undefined"
    {
        a=b;
        b=c;
        c=d;
        d=0;
        shiftl128(a,b,c,d,k-32);
    }
    else
    {
        a = (a << k) | (b >> (32-k));
        b = (b << k) | (c >> (32-k));
        c = (c << k) | (d >> (32-k));
        d = (d << k);
    }
}

void shiftr128 (
    unsigned int& a,
    unsigned int& b,
    unsigned int& c,
    unsigned int& d,
    size_t k)
{
    assert (k <= 128);
    if (k >= 32) // shifting a 32-bit integer by more than 31 bits is "undefined"
    {
        d=c;
        c=b;
        b=a;
        a=0;
        shiftr128(a,b,c,d,k-32);
    }
    else
    {
        d = (c << (32-k)) | (d >> k); \
        c = (b << (32-k)) | (c >> k); \
        b = (a << (32-k)) | (b >> k); \
        a = (a >> k);
    }
}

这篇关于在128位的数目按位移位操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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