Помощь в базовых манипуляциях с битами - PullRequest
1 голос
/ 04 февраля 2010

Это продолжение вопроса из моего ранее отвеченного вопроса:

Чтение символов на битовом уровне

Проблема, которую я, похоже, понимаю, заключается в пониманииосновные понятия манипулирования битами в C. Я понимаю, что нужно сделать, но у меня возникают проблемы при разработке решения.

Пример:

Изменение 01101010 на 00111110 с использованием логическогооператор.

Я понимаю принцип и потребность в маске для реализации решения, но я не понимаю, как это сделать программно.

Я пришел из C # фона с большим опытом и имеютолько недавно начал развиваться в C.

Может кто-нибудь дать мне несколько советов или советов для завершения примера?

Ниже приводится решение, если кто-то еще посчитает его полезным:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h.>

int main()
{
    //01101010 - 106 Decimal
    char a = 0x6A;

    //01010100 - 84 Decimal
    char b = 0x54;

    //00111110 - Uses exclusive or (XOR)
    char c = a ^ b;

    //Prints out in Hex - 62 Decimal
    printf("%x",c);

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 04 февраля 2010

Я бы продолжил так: сначала посмотрим, какие биты нужно изменить.Если вам нужно только изменить 1 с на 0, вам нужно &.Если вам нужно только изменить значение от 0 до 1, вам нужно |.Если вам нужно изменить в обоих направлениях, как, например, здесь, вам нужно ^, потому что это единственный оператор, который может идти обоими путями, так сказать.

Теперь это просто вопрос поиска правильногобитовая маска для XOR.Начиная с 1^0=1 и 0^0=0, вы должны установить биты, которые вы не хотите менять, на 0 в битовой маске.Установите для других значение 1 (1^1 равно 0 и 0^1 равно 1), и вы получите желаемый результат.

2 голосов
/ 04 февраля 2010

Вы можете XOR их вместе.XOR двух битов равно 1, если ровно один из битов равен 1.

    01101010
XOR 00111110
=
    01010100

XOR, при котором первое значение с таким результатом даст вам второе.

    01101010
XOR 01010100
=   00111110

In C:

char a = 0x6A;
char b = 0x3E;
char c = a ^ b;

(c ^ a == a ^ b ^ a) && (a ^ b ^ a == b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...