сдвинуть биты из байта в (массив) - PullRequest
4 голосов
/ 29 сентября 2011

Я решил проблему, но не знаю, как правильно ее опубликовать, поэтому я редактирую этот пост и ставлю решение в конце.


Нужна помощь со следующим в C, пытаясь сместить битные биты в обратном порядке.

Я хочу, чтобы Step1[] = {1,0,0,1,0,0,0,0}; стал {0,0,0,0,1,0,0,1}.

void Stepper(void)
{
static uint8_t Step1[] = {1,0,0,1,0,0,0,0};
BridgeControl(Step1);
}

void BridgeControl(unsigned char *value)
{
    uint8_t tempValue;
    uint8_t bit = 8;
    uint8_t rev = 1;

    if (rev) // CW otherwise CCW
    {
        tempValue = *value;
        do{

        if(tempValue) // Right-shift one
            tempValue = 1 >> 1;
        else
            tempValue = 0 >> 1;

        }while(--bit, bit);
        *value = tempValue;
    }

Я знаю, что bridcontrol совершенно не прав, здесь мне может понадобиться помощь! С уважением


Новый код:

void BridgeControl(uint8_t *value)
{
    // For example, initial value could be 1001000 then I
    // would like the outcome to be 00001001

    uint8_t tempValue;

    uint8_t bit = 3;
    uint8_t rev = 1;

    if (rev) // CW otherwise CCW
    {
        tempValue = *value; //so... its 0b10010000
        do{
            tempValue >>=1; //1st this produce 01001000
            tempValue = 0 >> 1; //1st this produce 0010 0100
                                //2nd time produce 0001 0010
                                //3d time produce 0000 1001
        }while(--bit, bit);
    *value = tempValue;
    }
    M1BHI = value[7];
    M1BLI = value[6];
    M1AHI = value[5];
    M1ALI = value[4];
    M2BHI = value[3];
    M2BLI = value[2];
    M2AHI = value[1];
    M2ALI = value[0];
}

Решение:

void BridgeControl(uint8_t value)
{
    uint8_t tempvalue[8];
    uint8_t i = 8;
    uint8_t cont;
    cont = value;
    do{
        value = value >> i-1;
        value = value & 1;
        tempvalue[8-i] = value;
        value = cont;
    }while(--i,i);

    M1BHI = tempvalue[7]; 
    M1BLI = tempvalue[6]; 
    M1AHI = tempvalue[5]; 
    M1ALI = tempvalue[4]; 
    M2BHI = tempvalue[3]; 
    M2BLI = tempvalue[2]; 
    M2AHI = tempvalue[1]; 
    M2ALI = tempvalue[0]; 


}

Если я хочу изменить порядок следования битов в массиве, просто измените tempvalue[8-i] на tempvalue[i-1].

Ответы [ 7 ]

2 голосов
/ 29 сентября 2011

Ваши имена переменных звучат так, будто вы пытаетесь работать с оборудованием.Так что я думаю, что вы действительно хотите сдвигать биты в одной байтовой переменной, а не в массиве int.

Этот статус меняет биты в байте:

byte reversedVal = (byte) (val & 1 << 7
                          + val & 2 << 5
                          + val & 4 << 3
                          + val & 8 << 1
                          + val & 16 >> 1
                          + val & 32 >> 3
                          + val & 64 >> 5
                          + val & 128 >> 7);

Если вы действительно хотите обратитьВ массиве int вы можете использовать метод LINQs Reverse, как рекомендует scottm, но это, вероятно, не самый быстрый вариант.

1 голос
/ 29 сентября 2011

Easy-cheesy с Array.Reverse () :

byte[] step1 = new {0,1,0,1};

var reversed = Array.Reverse(step1);

Если вам действительно нужно поменять местами байты, вы можете посмотреть ответ здесь .

0 голосов
/ 30 сентября 2011
//Exempel of input going to function: int value = 0b10010000; 

void BridgeControl(uint8_t value uint8_t dir) 
{ 
    uint8_t tempvalue[8]; 
    uint8_t i = 8; 
    uint8_t cont; 
    cont = value;
 if (dir){
    do{ 
        value = value >> i-1; 
        value = value & 1; 
        tempvalue[8-i] = value; 
        value = cont; 
    }while(--i,i); 
 }
 else{
    do{ 
        value = value >> i-1; 
        value = value & 1; 
        tempvalue[i-1] = value; 
        value = cont; 
    }while(--i,i); 
 }
    M1BHI = tempvalue[7];  
    M1BLI = tempvalue[6];  
    M1AHI = tempvalue[5];  
    M1ALI = tempvalue[4];  
    M2BHI = tempvalue[3];  
    M2BLI = tempvalue[2];  
    M2AHI = tempvalue[1];  
    M2ALI = tempvalue[0];  
} 
0 голосов
/ 30 сентября 2011
// changed the parameter to suit the type of members of array
void BridgeControl(uint8_t *value)
{
    uint8_t tempvalue;

    // only need to loop till midway; consider the two sides as lateral images of each other from the center
    for (int i=0; i < 8/2; i++)
    {
        // preserve the current value temporarily
        tempvalue = *[value + i];
        // set the current value with the value in the mirrored location
        // (8th position is the mirror of 1st; 7th position is the mirror of 2nd and so on)
        *[value + i] = *[value + (7 - i)];
        // change the value in the mirrored location with the value stored temporarily
        *[value + (7 - i)] = tempvalue;
    }

}
// you may want to use sizeof(uint8_t) * (7 - i) instead of (7 - i) above
0 голосов
/ 30 сентября 2011
void BridgeControl(unsigned char values[], int size){
    unsigned char *head, *end, wk;
    for(head = values, end = values + size - 1; head < end; ++head, --end){
        wk = *head;
        *head = *end;
        *end = wk;
    }
}
void Stepper(void){
    static unsigned char Step1[] = {1,0,0,1,0,0,0,0};
    BridgeControl(Step1, sizeof(Step1));
}
0 голосов
0 голосов
/ 29 сентября 2011

выглядит как дубликат Как изменить порядок массива байтов в c #?

Использование Array.Reverse

byte[] bytes = GetTheBytes();
Array.Reverse(bytes, 0, bytes.Length);

Использование LINQ

byte[] bytes = GetTheBytes();
byte[] reversed = bytes.Reverse().ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...