Страница 1 из 1

Битовые операции на чистом Си

Добавлено: 17 мар 2013, 21:15
doojkee
Добрый вечер, форумчане, нужна ваша помощь, никак не могу додуматься, как сделать это задание:
Установить в заданные пользователем значения некоторые разряды, количество которых и номера разрядов задаются с клавиатуры.

Более подробно:

1.вводим число
2.переводим его в 2ую систему
3.вводим 1 или 0
4.вводим число разрядов
5.вводим номера разрядов
6.заменяем в введенных разрядах значения 1 или 0 (в зависимости, от того, что мы ввели в п.3);
7.выводим измененное число


Задание нужно выполнить на чистом Си.
Вот мои наработки:

Код: Выделить всё

#include <stdio.h>
#include <conio.h>
#include <windows.h>

int output(char x[]){
    int i,j;
    for (i = 7; i >-1; i--)
        for (j = 7; j >-1; j--){
            printf("%d",(x[i]>>j)&1);
            }
    printf("\n");
}


int main(){
    int i,n_bit,k_num_bits, number;
    system("cls");

    union{
        double m;
        char a[8];
    }type;


printf("Enter the number: ");
scanf("%lf", &type.m);

output(type.a);

printf("Enter the '1' or '0': ");
scanf("%d", &number);

    printf("Enter the numbers of bits: ");
    scanf("%d", &n_bit);

    for(i = 0;i < n_bit;i++){
        printf("Enter the number of bits: ");
        scanf("%d",&k_num_bits);
        type.a[k_num_bits/8] = type.a[k_num_bits/8]^(1<<(k_num_bits-8*(k_num_bits/8)));
    }

printf("\n");
output(type.a);
printf("\n");

printf("\nResult is:  -> %lf ", type.m);

getch();
return 0;

}
В моей коде работает все, только для введенного значения 1, если 0, я не знаю, как дописать этот функционал!
Надеюсь на вашу помощь!

Re: Битовые операции на чистом Си

Добавлено: 18 мар 2013, 14:21
Albor
Число по условию должно быть 8-ми байтным? Число не обязательно переводить в 2-ю систему, опять-же, если это не оговорено в условии. Числа в памяти и так в 2-й системе и с ними можно производить битовые операции без каких-либо преобразований. Для установки/сброса определённых бит можно подготовить маску с 1/0 в нужных разрядах и после произвести побитовое И/ИЛИ. Например, в числе 15 (1111) обнулить 1й и 3й разряды: готовим маску с 0 в этих разрядах, т. е. 0101 и производим побитовое И: 1111 & 0101 = 0101. Можно тем же способом что и у вас, последовательно сдвигая маску.

Re: Битовые операции на чистом Си

Добавлено: 19 мар 2013, 09:48
Albor
Предлагаю такой вариант получения маски. Функцию main показал для того, чтобы было понятно, как вывести 64-битное значение printf - ом. 16-ричный вывод, как по мне, понятнее в данной ситуации, чем 10-тичный. Функция getMask первым параметром получает номер бита, а вторым - булево значение : если true, значит хотим установить бит, иначе - сбросить. Для установки бита в исходном числе делаем операцию ИЛИ с маской, для сброса - И

Код: Выделить всё

#include <stdio.h>   
#include <conio.h> 

typedef unsigned long long int ull;

ull getMask(unsigned char numbit,bool bSetbit=true)
{
	ull mask=0;
	if(numbit>63)
	{
		printf("Error bit's number\n");
	}
	else mask=(ull)1<<numbit;
	return bSetbit?mask:~mask;
}

int _tmain(int argc, _TCHAR* argv[])
{
	printf("%llx\n",getMask(63));
    printf("%llx\n",getMask(63,false));

	getch();
   
   return 0;
}