高手留步, 高分求教!

yxlijinzhu 2006-03-14 07:52:06
我想将一个Buffer中的所有数据按位向左(或右)移动n位, 有没有什么效率比较高的方法呢?

比如:(bit流)
000111111110000010100011001111100
向左移动3位后:
111111110000010100011001111100000

...全文
240 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2006-03-15
  • 打赏
  • 举报
回复
你的问题可以用 位集操作解决 ~
jixingzhong 2006-03-15
  • 打赏
  • 举报
回复
STL 中位集 bitset ....
yxlijinzhu 2006-03-15
  • 打赏
  • 举报
回复
在intel平台上真的只能按字节处理吗, 没有更好的办法了吗?
ox_thedarkness 2006-03-15
  • 打赏
  • 举报
回复
贴一个以前写的, unsigned long 版本:
///////////////////////////////////////////////////

shl 左移
shr 右移
TEST_BIT 测试位
SET_BIT 设置某位为1
CLR_BIT 设置某位为0

参数一律是
( 指向long数组的指针, 数组大小,要操作的位 )

===========================================
void shl( unsigned long*, int nDW, unsigned int );
void shr( unsigned long*, int nDW, unsigned int );

static int bitwide_op_temp;// temp for macros
#define TEST_BIT( pBits, nDW, nShift )\
((pBits)[ bitwide_op_temp = (nShift), (nDW) - bitwide_op_temp/32 - 1 ] \
& 1<< bitwide_op_temp %32 )

#define SET_BIT( pBits, nDW, nShift )\
((pBits)[ bitwide_op_temp = (nShift), (nDW) - bitwide_op_temp/32 - 1 ] \
|= 1<< bitwide_op_temp %32 )

#define CLR_BIT( pBits, nDW, nShift )\
((pBits)[ bitwide_op_temp = (nShift), (nDW) - bitwide_op_temp/32 - 1 ] \
&= ~(1<< bitwide_op_temp %32) )

int main(){
unsigned long buf[] = { 0xFFFFFFFF, 0xAAAAAAAA, 0x00000000, 0x55555555 };

shr( buf, 4, 34 );

for( int i = 127; i>= 0; i-- ){
if( TEST_BIT( buf, 4, i ) ) printf("1");
else printf("0");
if ( i%32 == 0 ) printf("\n");
}
}


//------------------------implementations-------------------------------
void shl( unsigned long* pBits, int nDW, unsigned int nShift ){
unsigned long* pSource = pBits + nShift/ 32;
unsigned long* pTail = pBits + nDW - 1;
nShift %= 32;
int nRevShift = 32 - nShift;

while( pSource < pTail ){
*pBits = *pSource << nShift;
*pBits++ |= *++pSource >> nRevShift;
}
*pBits = *pSource << nShift;
while( pBits < pTail )
*++pBits = 0;
}

void shr( unsigned long* pBits, int nDW, unsigned int nShift ){
unsigned long* pDest = pBits + nDW - 1;
unsigned long* pSource = pDest - nShift/32;

nShift %= 32;
int nRevShift = 32 - nShift;
while( pSource > pBits ){
*pDest = *pSource >> nShift;
*pDest-- |= *--pSource << nRevShift;
}
*pDest = *pSource >> nShift;
while( pDest > pBits )
*--pDest = 0;
}
===========================================
  • 打赏
  • 举报
回复
学习
MagicCarmack 2006-03-15
  • 打赏
  • 举报
回复
用STL不错

yxlijinzhu 2006-03-14
  • 打赏
  • 举报
回复
我现在做的事二值图像(一个字节代表了8个象素)的处理, 比如剪裁, 复制, 旋转等.
mp6 2006-03-14
  • 打赏
  • 举报
回复
假设你的buffer指针是data,数据类型是char,长度是NUM(char data[NUM]), 向左移3位(8位以内都一样),

for (i = 0; i < (NUM - 1); ++i)
{
*(data + i) = ((*(data + i) << 3) & 0xf8) | (*(data + i + 1) << 5) & 0x03);
}
data[NUM - 1] <<= 3;
mp6 2006-03-14
  • 打赏
  • 举报
回复
呵呵,如果真想老老实实移位,你用char型,不用考虑是little endian还是big endian
ykzhujiang 2006-03-14
  • 打赏
  • 举报
回复
你用<<明显是不行的,因为你现在需要移位的是bit流而不是整数
可以参考一下bitset 开源的
mp6 2006-03-14
  • 打赏
  • 举报
回复
这个是用在什么地方的?
yxlijinzhu 2006-03-14
  • 打赏
  • 举报
回复
我这样做过
unsigned int* p = pBuf;

*p = *p < < 4;

但结果不对, 原因就是intel的字节序问题.

可以给我写一个sample吗, 谢谢谢谢!
yxlijinzhu 2006-03-14
  • 打赏
  • 举报
回复
我这样做过
unsigned int* p = pBuf;

*p = *p << 4;

但结果不对, 原因就是intel的字节序问题.
pBuf中那4个字节没有整体向左移动4字节, 而是第3个字节向左移动了.其他字节不变.

可以给我写一个sample吗, 谢谢谢谢!
ykzhujiang 2006-03-14
  • 打赏
  • 举报
回复
汇编
或者用STL的bitset也不错
yxlijinzhu 2006-03-14
  • 打赏
  • 举报
回复
逻辑移位
ykzhujiang 2006-03-14
  • 打赏
  • 举报
回复
算术移位还是逻辑移位?

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧