如何实现几个字节同事偏移N位(按bit位偏移)?

2019-07-21 06:27发布

比如有一个三个元素的数组,转换成二进制 内容如下  00001111 00001111 00001111  ,让他们同时往左偏移3个bit位  变成 00000001 11100001 11100001  如何用C语言来实现呢?越简短越好谢谢各位网友


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
Yefeng是叶峰
1楼-- · 2019-07-22 00:51
xiatianyun 发表于 2018-12-22 10:50
如果元素个数是三个,问题比较简单,可如果个数未知就只能单个右移了。
对以,你要求左移,怎么你右移了呢 ...

抱歉抱歉是我写错了
Yefeng是叶峰
2楼-- · 2019-07-22 04:08
static void data_offset(uint8_t len, uint8_t data_len, uint8_t* data)
{
        uint8_t byte_nums = (data_len + 7) / 8;
        uint8_t index = byte_nums;

        data[index] = data[index - 1] << (8-len)|data[index] >> len;
        for (; index > 0; index--)
        {
                if (index == 1)
                {
                        data[index - 1] >>= len;
                }
                else
                {
                        data[index - 1] = data[index - 2] << (8-len) | data[index - 1] >> len;
                }
        }
}

这是我写的一个函数,能实现整体的右移, len:偏移量,data_len是数据长度,单位都是bit,data是需要移动的数据,这个数据的长度,必须比byte_nums大1,因为如果是1个字节偏移的情况,可能需要两个字节来装后面溢出的那一部分。
但是我还是觉得我写的太麻烦,不知道有没有网友可以提供一个更简单的方法
Yefeng是叶峰
3楼-- · 2019-07-22 06:20
 精彩回答 2  元偷偷看……
xiatianyun
4楼-- · 2019-07-22 12:08
Yefeng是叶峰 发表于 2018-12-22 11:24
static void data_offset(uint8_t len, uint8_t data_len, uint8_t* data)
{
        uint8_t byte_nums = (data ...

问一下,你这里的data_len到底是数据长度还是数据数量?
按说应该是数据数量,但是如果是数量的话开始的 data[index] = ......就越界了。
xiatianyun
5楼-- · 2019-07-22 16:07
xiatianyun 发表于 2018-12-23 19:58
问一下,你这里的data_len到底是数据长度还是数据数量?
按说应该是数据数量,但是如果是数量的话开始的 ...

编了一个移动范围为8以内的程序供参考:
void data_offset(unsigned char offset, unsigned char number, unsigned char* pData)
{
        unsigned char* pTemp = pData + number - 1; //pTemp &#214;&#184;&#207;ò×&#238;&#196;&#169;&#210;&#187;&#184;&#246;&#212;&#170;&#203;&#216;×&#214;&#189;&#218;&#163;&#172;&#208;&#161;&#182;&#203;&#196;&#163;&#202;&#189;&#207;&#194;&#202;&#199;×&#238;&#184;&#223;×&#214;&#189;&#218;&#161;&#163;
        for(int i = 0; i < number; i++)
        {
                *pTemp = (*pTemp << offset) | (*(pTemp - 1) >> (8 - offset));
                pTemp--;
        }                       
}
Yefeng是叶峰
6楼-- · 2019-07-22 17:22
xiatianyun 发表于 2018-12-23 19:58
问一下,你这里的data_len到底是数据长度还是数据数量?
按说应该是数据数量,但是如果是数量的话开始的 ...

data_len是需要偏移的数据长度  单位是(bit)  比如data_len=16 就两个字节的数据长度

一周热门 更多>