Как установить 513-й бит символа [1024] в C? - PullRequest
4 голосов
/ 13 октября 2011

Меня недавно спросили в интервью, как установить 513-й бит char[1024] в C, но я не уверен, как решить проблему.Я видел Как установить, очистить и переключить один бит? , но как выбрать бит из такого большого массива?

Ответы [ 6 ]

8 голосов
/ 13 октября 2011
int bitToSet = 513;
inArray[bitToSet / 8] |= (1 << (bitToSet % 8));

... делая определенные предположения о размере символа и желаемом порядке байтов.

РЕДАКТИРОВАТЬ: Хорошо, хорошо. Вы можете заменить 8 на CHAR_BIT, если хотите.

4 голосов
/ 13 октября 2011
#include <limits.h>

int charContaining513thBit = 513 / CHAR_BIT;
int offsetOf513thBitInChar = 513 - charContaining513thBit*CHAR_BIT;

int bit513 = array[charContaining513thBit] >> offsetOf513thBitInChar & 1;
2 голосов
/ 14 октября 2011

Небольшая оптимизация:

Операторы / и% довольно медленные, даже на многих современных процессорах, а модуль немного медленнее. Я бы заменил их эквивалентными операциями, используя сдвиг (и вычитание) битов, что хорошо работает только тогда, когда второй операнд имеет степень двойки, очевидно.

х / 8 становится х >> 3
x% 8 становится x - ((x >> 3) << 3) <br> для этой второй операции просто повторно используйте результат начального деления.

2 голосов
/ 13 октября 2011

Вы должны знать ширину символов (в битах) на вашем компьютере.Для почти всех это 8. Вы можете использовать константу CHAR_BIT из limits.h в программе на Си.Затем вы можете сделать довольно простую математику, чтобы найти смещение бита (в зависимости от того, как вы их подсчитываете).

Нумерация битов слева, с битом 2 in в [0], бит 0,2-битный бит 7, а 2-битный в [1] бит 8, это дает:

offset = 513 / CHAR_BIT;  /* using integer (truncating) math, of course */
bit = 513 % CHAR_BIT;
a[offset] |= (0x80>>bit)

Существует много здравых способов нумерации битов, вот два:

 a[0]                      a[1]
 0  1  2  3  4  5  6  7     8  9 10 11 12 13 14 15     This is the above
 7  6  5  4  3  2  1  0    15 14 13 12 11 10  9  8     This is |= (1<<bit)

Вы можете также нумеровать с другого конца массива (обрабатывая его как одно очень большое число с прямым порядком байтов).

1 голос
/ 13 октября 2011

В зависимости от желаемого порядка (слева направо и справа налево), он может измениться.Но общая идея, предполагающая 8 бит на байт, состоит в том, чтобы выбрать байт как.Это расширено до множества строк кода, чтобы, надеюсь, более четко показать намеченные шаги (или, возможно, это просто скрывает намерение):

int bitNum = 513;
int bytePos = bitNum / 8;  

Тогда позиция бита будет вычислена как:

int bitInByte = bitNum % 8;

Затем установите бит (при условии, что целью является установить его в 1, а не очищать или переключать его):

charArray[bytePos] |= ( 1 << bitInByte );
0 голосов
/ 21 октября 2011

Когда вы говорите 513-й, используете ли вы индекс 0 или 1 для 1-го бита? Если это первое, ваше сообщение ссылается на бит в индексе 512. Я думаю, что вопрос верен, поскольку везде в C первый индекс всегда равен 0.

КСТАТИ

static char chr[1024];
...
chr[512>>3]=1<<(512&0x7);
...