【发布时间】:2011-11-30 17:21:00
【问题描述】:
洋蓟101asked this:
假设我有一个由 4 个 32 位整数组成的数组,用于存储 128 位数字
如何对这个 128 位数字进行左移和右移?"
我的问题与 Remus Rusanu 给出的答案有关:
void shiftl128 (
unsigned int& a,
unsigned int& b,
unsigned int& c,
unsigned int& d,
size_t k)
{
assert (k <= 128);
if (k > 32)
{
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)
{
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);
}
}
让我们只关注一个班次,比如说左班次。具体来说,
a = (a << k) | (b >> (32-k));
b = (b << k) | (c >> (32-k));
c = (c << k) | (d >> (32-k));
d = (d << k);
如何左移 128 位数字?我知道什么是位移,
a = (a << k) | (b >> (32-k)) 如何正确移动 128 位数字的第一部分 (32)?
【问题讨论】:
-
我建议不要硬编码
32,而是使用sizeof(unsigned int)。它应该是32,但至少你会确定它。 -
sizeof(unsigned int)将是 4。:) 所以,你需要sizeof(unsigned int)*CHAR_BIT。
标签: c++ bit-manipulation