Как вы сбрасываете значение бита в строке? - PullRequest
0 голосов
/ 30 сентября 2011

В недавнем интервью я получил такой вопрос:

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 ]

10 голосов
/ 30 сентября 2011

Для переключения любого бита в строке:

#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 (^).

5 голосов
/ 30 сентября 2011

Предполагается, что char равно 8 битам, а порядковый номер имеет младший порядковый номер:

char *str = ...;

str[15] ^= 0x80;

Это перевернет 127-й бит.bit-endian - это big-endian, затем используйте 0x01.

Ответ также зависит от того, как пронумерованы биты.Если мы начнем нумерацию с 0, используйте 0x80.Если мы индексируем от 1, то мы используем 0x40.(0x01 и 0x02 для big-endian)

EDIT 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.
0 голосов
/ 30 сентября 2011

Вы должны создать битовую маску, для n-го бита битовая маска будет иметь вид:

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

и перевернуть бит для строки и битовой маски:

string ^= bitmask;
0 голосов
/ 30 сентября 2011

1-й, если вы спрашиваете, говорит, как переключить не сбросить окей

Для переключения немного

Оператор XOR (^) можетиспользоваться для переключения бита.

 number ^= 1 << x; 

Это переключит бит x.для получения дополнительной информации о таком случае прочитайте это

Теперь, как вы знаете, строка - это число символов, а размер символа - 1 байт, так что теперь любой бит, который вы хотите переключать, ставит вместоX в и строка вместо номера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...