如何重置字符串中的位值?

在最近的采访中我得到了一个这样的问题:

Given a string value, find out its 127th bit and reset it, do this in C language Reset means if that particular bit is 0 change to 1 and vice versa

我没有找到任何算法,但我想知道如何用C语言解决这个问题。

编辑:

从少数人得到答案后,我尝试了这个:

 #include void main() { char *str="anto"; str[15] ^= 0x80; printf("%s",str); } 

我得到的输出为: anto 。 现在我的头脑中有一点点改变一点不会改变输出?

假设char是8位且endian是little-endian:

 char *str = ...; str[15] ^= 0x80; 

这将翻转第127位。

编辑:

如果bit-endian是big-endian,则使用0x01代替。

答案还取决于位的编号方式。 如果我们从0开始编号,则使用0x80 。 如果我们从1开始索引,那么我们使用0x40 。 (big-endian的0x010x02

编辑2:这是一般情况:(具有相同的假设)

 char *str = ...; int bit = 127; int index = bit / 8; // Get the index int chbit = bit % 8; // Get which bit in the char int mask = 1 << chbit; // Build the mask str[index] ^= mask; // XOR to flip the bit. 

要切换字符串中的任何位:

 #include  void flip_bit(char *x, int bit_no) { (x + bit_no/CHAR_BIT) ^= 1 << bit_no%CHAR_BIT; } 

说明:找到bit_no:th位分两步完成:

首先是所需的整个字节数(整数除法):( x + bit_no / CHAR_BIT)

然后剩下很多比特。 这是通过将1乘以bit_no%CHAR_BIT位(余数)来完成的。

最后使用xor运算符(^)切换位。

第一个是你问的是说切换没有重置 okey

要切换一下

XOR运算符(^)可用于切换位。

  number ^= 1 << x; 

那将切换位x。 有关此类思考的更多信息请阅读此内容

现在你知道字符串是字符数和1字符的大小是1字节所以现在你想要切换,而不是X in和字符串代替数字。

你必须创建一个位掩码,对于第n位,位掩码将是:

 char *bitmask = 2^(n-1); 

并翻转xor字符串和位掩码:

 string ^= bitmask;