所以我有一个数字的二进制表示作为字符数组。我需要做的是将此表示向右移动11位。
例如,
我有一个char数组,当前存储此字符串: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;
}
对此的任何帮助都将非常感谢;如果我不清楚,请告诉我。
答案 0 :(得分:2)
他们只是人物......
char *shift_right(unsigned char *ar, int size, int shift)
{
memmove(&ar[shift], ar, size-shift);
memset(ar, '0', shift);
return(ar);
};
或者,将字符串转换为long-long,将其移位,然后返回字符串:
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 :(得分:0)
如果你真的想使用按位移位,那么就不能在字符串上进行。根本不可能!!
你必须将它转换为整数(使用strtol
)然后按位移位。之后,将其转换回字符串(没有标准库函数,使用for
循环)。
答案 2 :(得分: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;
}