2014-05-07 62 views
0

所以我有一个数字的二进制表示作为字符数组。我需要做的是将这种表示向右移动11位。字符数组按位运算

例如,

我有一个字符数组这是目前存储该字符串:11000000111001 执行逐位移后,我将得到110之前它的一些零。

我尝试使用此功能,但它给了我奇怪的输出:

char *shift_right(unsigned char *ar, int size, int shift) 
{ 
int carry = 0;        // Clear the initial carry bit. 
while (shift--) {       // For each bit to shift ... 
    for (int i = size - 1; i >= 0; --i) { // For each element of the array from high to low ... 
     int next = (ar[i] & 1) ? 0x80 : 0; // ... if the low bit is set, set the carry bit. 
     ar[i] = carry | (ar[i] >> 1);  // Shift the element one bit left and addthe old carry. 
     carry = next;      // Remember the old carry for next time. 
    } 
} 
return ar; 
} 

任何帮助将是非常赞赏;如果我不清楚,请告诉我。

+1

我不知道你认为这个按位或者与'0x80'打算做什么..我们只是在这里操作字符'1'和'0'。如果你做'0x80 | '1'你最终会出现一个会打印为某种符号的字符 –

+0

你的权利,我试图使用这里提供的答案(http://stackoverflow.com/questions/10367616/bitwise-shifting-array - 字符)作为指导,但没有奏效, – user3610554

回答

2

他们只是字符...

char *shift_right(unsigned char *ar, int size, int shift) 
    { 

    memmove(&ar[shift], ar, size-shift); 
    memset(ar, '0', shift); 

    return(ar); 
    }; 

或者,将字符串转换为长隆,移位,然后回一个字符串:

char *shift_right(char *ar, int size, int shift) 
    { 
    unsigned long long x; 
    char *cp; 

    x=strtoull(ar, &cp, 2); // As suggested by 'Don't You Worry Child' 
    x = x >> shift; 
    while(cp > ar) 
     { 
     --cp; 
     *cp = (1 & x) ? '1' : '0'; 
     x = x >> 1; 
     } 

    return(ar); 
    }; 
+1

当然,在执行此操作之前,请检查'shift 0' –

+0

好点@MattMcNabb。 –

+0

完美的工作,除了我需要使用按位移。 – user3610554

0

如果你真的想使用按位移动,那么你不能在一个字符串上进行。根本不可能!

你必须将它转换为整数(使用strtol),然后按位移动。之后,将其转换回字符串(没有标准库函数,使用for循环)。

0

我会建议让代码简单易读。

#include <stdio.h> 
#include <stdlib.h> 

void shift_right (char* dest, const char* source, int shift_n) 
{ 
    uint16_t val = strtoul(source, NULL, 2); 
    val >>= shift_n; 

    for(uint8_t i=0; i<16; i++) 
    { 
    if(val & 0x8000) // first item of the string is the MSB 
    { 
     dest[i] = '1'; 
    } 
    else 
    { 
     dest[i] = '0'; 
    } 
    val <<= 1; // keep evaluating the number from MSB and down 
    } 

    dest[16] = '\0'; 
} 


int main() 
{ 
    const char str [16+1] = "0011000000111001"; 
    char str_shifted [16+1]; 

    puts(str); 
    shift_right(str_shifted, str, 11); 
    puts(str_shifted); 

    return 0; 
} 
+0

这适用于我的示例,但如果我的表示具有更多位,则它不起作用。我怎么能做到这个表示'x'多位? – user3610554

+0

@ user3610554“x”位没有任何意义,也没有任何不是8的倍数。必须有一个指定的最大限制。当你有这个,你可以很容易地修改上述以适应任何大小。 – Lundin