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

时间:2011-09-30 07:29:24

标签: c bit-manipulation

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

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<stdio.h>
void main()
{
    char *str="anto";
    str[15] ^= 0x80;
    printf("%s",str);
}

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

4 个答案:

答案 0 :(得分:10)

切换字符串中的任何位:

#include <limits.h>

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运算符(^)切换位。

答案 1 :(得分:5)

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

char *str = ...;

str[15] ^= 0x80;

这将翻转第127位。

编辑:

如果bit-endian是big-endian,那么请改用0x01

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

编辑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.

答案 2 :(得分:0)

第一个是你问的是切换而不是重置 okey

要切换一下

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

 number ^= 1 << x; 

那将切换位x。  有关此类read this

的更多信息

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

答案 3 :(得分:0)

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

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

并将位x或字符串和位掩码翻转:

string ^= bitmask;