Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/46: Рейтинг темы: голосов - 46, средняя оценка - 4.98
0 / 0 / 1
Регистрация: 27.04.2011
Сообщений: 84
1

Проинвертировать два младших разряда старшего байта числа

31.05.2011, 01:00. Показов 9512. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите написать задачку!!!
Задано целое число. Надо проинвертировать два младших разряда старшего байта этого числа.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2011, 01:00
Ответы с готовыми решениями:

Старший бит старшего байта поменять местами с младшим битом младшего байта
Ребят помогите прогу доработать. Задача такая: В одномерном массиве чисел целого типа (16 бит)...

Замена старшего байта А двоичным кодом числа k
Здравствуйте. Задача в том чтобы произвести замену старшего байта А двоичным кодом числа k. БУду...

Напишите программу, считающую сумму старшего и младшего разряда заданного с клавиатуры целого числа.
Напишите программу, считающую сумму старшего и младшего разряда заданного с клавиатуры целого числа.

Вывести целые числа от 2 до n, для которых значение младшего байта меньше значения старшего в двоичном представлении
Подскажите пожалуйста, как реализовать такую программу на С или на С++, которая находит все целые...

19
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
31.05.2011, 02:01 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

как-то так)
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    srand((unsigned)time(NULL));
    int i = rand() % 100; 
    printf("before = %d\nafter = %d", i, (i >> (1 + 1 - 2)) ^ ~(~0 << 2));
    getchar();
    return 0;
}
0
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
31.05.2011, 08:14 3
Maxwe11, не могли бы вы пояснить?
i >> (1 + 1 - 2) эквивалентно i>>(-1), или i<<1?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
31.05.2011, 08:20 4
для начала нужно определить эндианство
wiki. big endian
чтобы знать, какой из байтов младший, а какой старший
1
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
31.05.2011, 08:27 5
accept, может быть, решите задачу для обоих вариантов? =)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
31.05.2011, 11:13 6
C
1
(i >> (1 + 1 - 2))
странная запись, на ноль сдвигать нельзя

Python
1
2
3
4
5
6
7
>>> n = 257
>>> bin(n)
'0b100000001'
>>> r = n & (~0 << 2) | ~n & ~(~0 << 2)
>>> bin(r)
'0b100000010'
>>>
0
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
31.05.2011, 11:52 7
accept, все равно не понятно. можно по шагам? =)

Добавлено через 3 минуты
младший байт - это 8 бит которые расположены справа?
в 1000 0000 1111 1111, младший байт 1111 1111, а старший 1000 0000, так?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
31.05.2011, 11:56 8
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Meta_net, инверсию бита можно (и нужно) делать операцией XOR. Вязыках Си/Си++ она обозначается символом `^'.
Чтобы сделать инверсию одного бита достаточно поксорить на 1. То есть:
Код
0 ^ 1 = 1
1 ^ 1 = 0
Соответственно, чтобы выполнить инверсию двух бит, надо просто подобрать правильную маску. Посмотрим, что получится. Рассмотрим пример двух-байтового целого числа.
Код
1111 1100 1111 1111
Это запись сделана в двоичной системе. Нулевые биты здесь, это нужные нам разряды. Соответственно маска будет такой:
Код
0000 0011 0000 0000
Выполняем XOR и получаем все единицы. Теперь осуществляем перевод в 16-ричную систему и делаем запись на Си.
C
1
2
3
4
5
6
7
#include <stdio.h>
int main() {
    unsigned short n = 0xFFFF; // исходное число
    unsigned short mask = 0x0300; // маска
 
    printf("%x", n ^ mask);
}
В результате должно получиться 0xFCFF. В двоичном виде это
Код
1111 1100 1111 1111.
0xFFFF - это само собой все единицы. То что надо, да?

Теперь определись с размером числа. Создай по примеру нужную маску и вперед. Из двоичной в шестнадцатиричную систему перевести же сможешь?
1
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
31.05.2011, 12:05 9
а если не знаешь размер числа, про размер в условии задачи ничего ведь не сказано??
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
31.05.2011, 12:21 10
Цитата Сообщение от no0ker Посмотреть сообщение
а если не знаешь размер числа, про размер в условии задачи ничего ведь не сказано??
Если не знаешь размер числа заранее, тогда придется работать со смещением. То есть делаешь маску на один байт - 0000 0011b. И двигаешь на количество байтов в числе минус 1.
Опять же, переводя на язык Си, это будет такая формула: n ^ (mask << ((sizeof(n) * 8) - 8)), или вот так: n ^ (mask << ((sizeof(n) - 1) * 8)). Выбирай на свой вкус.
То есть смысл то, остается тот же, ты так же генерируешь битовую маску, но с долей некоторой автоматизации и идиотизма.
Даже если в задании не указан четкий размер числа, то ты же будешь реализовывать задачу на числах, на числах какого-то конкретного типа, а тип не может быть безразмерен.
Просто в итоге, маска должна иметь такой же размер, что и число, вот и все. То есть тот же самый тип. Если число unsigned int, то и маска unsigned int, если число unsigned char, то и маска unsigned char и так далее.

Добавлено через 46 секунд

Не по теме:

Цитата Сообщение от no0ker Посмотреть сообщение
про битовые то операции я знаю
говоришь, знаешь, про битовые операции, а инверсию двух битов сделать не можешь, стыдно, стыдно...

1
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
31.05.2011, 12:36 11
То есть смысл то, остается тот же, ты так же генерируешь битовую маску, но с долей некоторой автоматизации и идиотизма.
не понял.

Добавлено через 3 минуты
еще вопрос
дано число (int) (4 байта)
0000 0000 0000 0000 1000 0000 0000 0000

а что после инвертации должно получиться

0000 0000 0000 0000 1000 0011 0000 0000

либо

0000 0011 0000 0000 1000 0000 0000 0000

?

Не по теме:

битовые операции... а что это ... где это.... может тут?

0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
31.05.2011, 13:23 12
no0ker, старший байт слева, младший справа. так что второй вариант.
0
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
31.05.2011, 13:31 13
старший байт слева, а младший байт справа. и именно из этого следует то, что второй вариант правильный? О_о или это следует из размера int (4 байта).
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
31.05.2011, 13:34 14
Цитата Сообщение от Meta_net Посмотреть сообщение
Задано целое число. Надо проинвертировать два младших разряда старшего байта этого числа.
Цитата Сообщение от fasked Посмотреть сообщение
старший байт слева, младший справа.
Старший байт, слева, четвертый байт в числе. В первом варианте инвертируются младшие разряды второго байта. Во втором варианте четвертого.
Я что-то не так сказал?

Если в задании указана инверсия разрядов старшего байта, то я считаю, что имеется в виду самый старший байт числа.
0
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
31.05.2011, 13:46 15
я хотел сказать, что если приходит (абстрактно) в программу "1000 0000 0000 0000", то для 4 байтного числа верен второй вариант, а для (к примеру) 2 байтного - первый.
и почему то, мне показалось, что правильный вариант выбирается исключительно из размера. а не из того факта, что "старший" - слева, а "младший" - справа. так как это факт - очевиден.

Добавлено через 1 минуту
в общем, вопрос мне ясен. спасибо. а то от темы и так уже ушли.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
31.05.2011, 13:46 16
Цитата Сообщение от no0ker Посмотреть сообщение
я хотел сказать, что если приходит (абстрактно) в программу "1000 0000 0000 0000", то для 4 байтного числа верен второй вариант, а для (к примеру) 2 байтного - первый.
Вы сказали, что дано 4-байтное число. А, как оказалось, хотели сказать что-то совершенно иное
0
no0ker
31.05.2011, 13:53
  #17

Не по теме:

да, я дал 4 байтное число. и именно из этого - следует правильность второго варианта. именно из этого. а вовсе не из того - что "старший" слева, а "младший" справа. это и так очевидно.

0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.06.2011, 03:45 18
Цитата Сообщение от no0ker
младший байт - это 8 бит которые расположены справа?
это зависит от эндианства
можешь создать переменную из нескольких байт и записать её в файл через fwrite()
потом открыть его и посмотреть в hex'е
ещё способ

с wiki переделал немного
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void)
{
    unsigned short n = 1;
    
    printf("%s-endian\n", *((unsigned char *) &n) ? "little" : "big");
    return 0;
}
Код
[guest@localhost tests]$ ./t
little-endian
[guest@localhost tests]$

с функцией
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int little_endian(void);
 
/* определяет эндианство */
int main(void)
{
    printf("%s-endian\n", little_endian() ? "little" : "big");
    return 0;
}
 
int little_endian(void)
{
    unsigned short n = 1;
    
    return *((unsigned char *) &n) != 0;
}

на самом деле порядков больше бывает

Цитата Сообщение от no0ker
все равно не понятно. можно по шагам
Python
1
r = n & (~0 << 2) | ~n & ~(~0 << 2)
n & (~0 << 2) - обнуляем у n младшие два бита
~n & ~(~0 << 2) - инвертируем n и берём младшие два бита
(n & (~0 << 2)) | (~n & ~(~0 << 2)) - складываем эти части

нужно, чтобы была возможность задавать любое количество бит
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
01.06.2011, 14:07 19
Цитата Сообщение от accept Посмотреть сообщение
это зависит от эндианства
Это не зависит от byte order пока не производится ввод информации с внешних носителей. Для битовых операций byte order прозрачен. То есть (n & 0xFF) всегда будет обнулять все байты, кроме младшего.
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.06.2011, 02:50 20
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

это мне показалось, что работа идёт со всем числом сразу
n & 0xFF возвратит самый младший байт в любом эндианстве
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
 
unsigned long invert_bits(unsigned long n, unsigned count);
void print_bin(unsigned long n, const char *end, FILE *ofp);
void test(long n, int i);
 
/* инвертирует биты в числах */
int main(void)
{
    test(125, 2);
    test(12345, 8);
    test(-40, 15);
    return 0;
}
 
unsigned long invert_bits(unsigned long n, unsigned count)
{
    return (n & (~0 << count)) | (~n & ~(~0 << count));
}
 
void print_bin(unsigned long n, const char *end, FILE *ofp)
{
    int i;
    
    for (i = sizeof n * 8 - 1; i >= 0; i--)
        fprintf(ofp, "%d", (n & (1 << i)) != 0);
    fprintf(ofp, "%s", end);
}
 
void test(long n, int i)
{
    printf("number: %ld invert: %d\n", n, i);
    print_bin(n, "\n", stdout);
    print_bin(invert_bits(n, i), "\n", stdout);
}
Код
[guest@localhost tests]$ ./t
number: 125 invert: 2
00000000000000000000000001111101
00000000000000000000000001111110
number: 12345 invert: 8
00000000000000000011000000111001
00000000000000000011000011000110
number: -40 invert: 15
11111111111111111111111111011000
11111111111111111000000000100111
[guest@localhost tests]$
0
02.06.2011, 02:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2011, 02:50
Помогаю со студенческими работами здесь

Найти все целые числа в диапазоне от 2 до n, у которых значение младшего байта меньше чем значение старшего и вывести
Если можно, напишите с // в трудных местах. Учусь на первом курсе, лекции немного отстают от...

Обнулить 3 младших разряда каждого элемент а в массиве
Массив состоит из 50 элементов размером в байт. Обнулить 3 младших разряда каждого элемент а в...

Цена единицы старшего разряда?
Доброго времени суток! Есть потенциометрический датчик. В спецификации описан протокол: 15 бит -...

Сумма младшего и старшего разряда
Напишите программу, считающую сумму старшего и младшего разряда заданного с клавиатуры целого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru