C++ _int 64は直接シフト演算はできません
_int64 x = 1<<40;
cout<
//x 0, 64 。
// :
//64 len
U64 move_left64(U64 a, int len)
{
U32 *p = (U32*) &a;
if (len <32)
{
*(p+1) <<= len;
U32 tmp = (*p) >> (32-len);
*(p+1) |= tmp;
*p <<= len;
}
else
{
*(p+1) = *p;
*p = 0x00000000;
*(p+1) <<= (len-32);
}
return a;
}
//64 len
U64 move_right64(U64 a, int len)
{
U32 *p = (U32*) &a;
if (len<32)
{
*p >>= len;
U32 tmp = *(p+1) << (32-len);
*p |= tmp;
*(p+1) >>= len;
}
else
{
*p = *(p+1);
*(p+1) = 0x00000000;
*p >>= (len-32);
}
return a;
}