重置字符串第8位的功能?

时间:2014-12-10 08:21:29

标签: c

我正在尝试创建一个重置字符串第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位......

有人可以帮我这个吗?

3 个答案:

答案 0 :(得分:0)

1 << 3000010001 << 710000000 ..在任何情况下,您都不会清除第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。