我正在尝试创建一个重置字符串第8位的代码。我已经成功了,但我相信它还不正确。这是代码:
#include <stdio.h>
#include <stdlib.h>
void make7bit(unsigned char *s, unsigned int n)
{
int i = 0;
int x =0;
while(x <n)
{
if(*s |= (1 << 7)) //it still works, whatever I have 1 << 7 or 1 << 3
*s = '0';
i++;
x++;
}
printf("%s", s);
return NULL;
}
int main()
{
char A[] ={"11111111"};
int n = 8;
make7bit(A, n);
return 0;
}
我不理解行if(*s |= (1 << 7))
,因为它不是1&lt;&lt; 7或其他东西(例如1&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 3&gt我很确定我在这里做错了什么,但是什么?我认为代码现在正在重置字符串的最后一位而不是我想要的第8位......
有人可以帮我这个吗?
答案 0 :(得分:0)
1 << 3
为00001000
,1 << 7
为10000000
..在任何情况下,您都不会清除第8位。
如果你想清除一点(不设置它),你应该:
*s &= ~(1 << 7);
答案 1 :(得分:0)
你的问题不清楚。这意味着'字符串的第8位'是什么意思?你应该重置每个字节的第8位?或者是其他东西?为什么将* s设置为'0'? “11111111”和“12345678”的结果应该相同吗?你是否假设通常的字符串,或者每个字符代表一位?
如果要复位每个字节的第8位,则应使用
*s &= 0x7F;
但通常你的来源不包含任何与所述任务相对应的行。
不过,你的循环毫无意义。你描述了两个循环变量,但从不使用它;你只需要连续8次修补一个字节。答案 2 :(得分:0)
你完成左移,值为1。
1 << 7
Now the bit is 10000000.
所以你正在使用这个值进行或操作。这里* s值是,
*s=1. Bit position of one is. 00110001.
因为ascii值为1,所以你使用的是字符,所以值是ascii。和一个字节的位表示。现在或操作。
00110001
10000000
---------
10110001
因此该值不为零,因此if条件有效且位置变为0。