0 / 0 / 1
Регистрация: 27.04.2011
Сообщений: 84
|
|
1 | |
Проинвертировать два младших разряда старшего байта числа31.05.2011, 01:00. Показов 9512. Ответов 19
Метки нет (Все метки)
Помогите написать задачку!!!
Задано целое число. Надо проинвертировать два младших разряда старшего байта этого числа.
0
|
31.05.2011, 01:00 | |
Ответы с готовыми решениями:
19
Старший бит старшего байта поменять местами с младшим битом младшего байта Замена старшего байта А двоичным кодом числа k Напишите программу, считающую сумму старшего и младшего разряда заданного с клавиатуры целого числа. Вывести целые числа от 2 до n, для которых значение младшего байта меньше значения старшего в двоичном представлении |
Каратель
|
||||||
31.05.2011, 02:01 | 2 | |||||
Сообщение было отмечено Памирыч как решение
Решение
как-то так)
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
|
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
|
31.05.2011, 11:56 | 8 | |||||
Сообщение было отмечено Памирыч как решение
Решение
Meta_net, инверсию бита можно (и нужно) делать операцией XOR. Вязыках Си/Си++ она обозначается символом `^'.
Чтобы сделать инверсию одного бита достаточно поксорить на 1. То есть: Код
0 ^ 1 = 1 1 ^ 1 = 0 Код
1111 1100 1111 1111 Код
0000 0011 0000 0000
Код
1111 1100 1111 1111. Теперь определись с размером числа. Создай по примеру нужную маску и вперед. Из двоичной в шестнадцатиричную систему перевести же сможешь?
1
|
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
|
|
31.05.2011, 12:05 | 9 |
а если не знаешь размер числа, про размер в условии задачи ничего ведь не сказано??
0
|
31.05.2011, 12:21 | 10 |
Если не знаешь размер числа заранее, тогда придется работать со смещением. То есть делаешь маску на один байт - 0000 0011b. И двигаешь на количество байтов в числе минус 1.
Опять же, переводя на язык Си, это будет такая формула: n ^ (mask << ((sizeof(n) * 8) - 8)), или вот так: n ^ (mask << ((sizeof(n) - 1) * 8)). Выбирай на свой вкус. То есть смысл то, остается тот же, ты так же генерируешь битовую маску, но с долей некоторой автоматизации и идиотизма. Даже если в задании не указан четкий размер числа, то ты же будешь реализовывать задачу на числах, на числах какого-то конкретного типа, а тип не может быть безразмерен. Просто в итоге, маска должна иметь такой же размер, что и число, вот и все. То есть тот же самый тип. Если число unsigned int, то и маска unsigned int, если число unsigned char, то и маска unsigned char и так далее. Добавлено через 46 секунд
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
|
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
|
|
31.05.2011, 13:31 | 13 |
старший байт слева, а младший байт справа. и именно из этого следует то, что второй вариант правильный? О_о или это следует из размера int (4 байта).
0
|
31.05.2011, 13:34 | 14 |
Старший байт, слева, четвертый байт в числе. В первом варианте инвертируются младшие разряды второго байта. Во втором варианте четвертого.
Я что-то не так сказал? Если в задании указана инверсия разрядов старшего байта, то я считаю, что имеется в виду самый старший байт числа.
0
|
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
|
|
31.05.2011, 13:46 | 15 |
я хотел сказать, что если приходит (абстрактно) в программу "1000 0000 0000 0000", то для 4 байтного числа верен второй вариант, а для (к примеру) 2 байтного - первый.
и почему то, мне показалось, что правильный вариант выбирается исключительно из размера. а не из того факта, что "старший" - слева, а "младший" - справа. так как это факт - очевиден. Добавлено через 1 минуту в общем, вопрос мне ясен. спасибо. а то от темы и так уже ушли.
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
можешь создать переменную из нескольких байт и записать её в файл через fwrite() потом открыть его и посмотреть в hex'е ещё способ
с wiki переделал немного
Код
[guest@localhost tests]$ ./t little-endian [guest@localhost tests]$ с функцией
на самом деле порядков больше бывает
Сообщение от no0ker
~n & ~(~0 << 2) - инвертируем n и берём младшие два бита (n & (~0 << 2)) | (~n & ~(~0 << 2)) - складываем эти части нужно, чтобы была возможность задавать любое количество бит
1
|
01.06.2011, 14:07 | 19 |
Это не зависит от byte order пока не производится ввод информации с внешних носителей. Для битовых операций byte order прозрачен. То есть (n & 0xFF) всегда будет обнулять все байты, кроме младшего.
1
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||||||
02.06.2011, 02:50 | 20 | |||||
Сообщение было отмечено Памирыч как решение
Решение
это мне показалось, что работа идёт со всем числом сразу
n & 0xFF возвратит самый младший байт в любом эндианстве
Код
[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 | |
02.06.2011, 02:50 | |
Помогаю со студенческими работами здесь
20
Найти все целые числа в диапазоне от 2 до n, у которых значение младшего байта меньше чем значение старшего и вывести Обнулить 3 младших разряда каждого элемент а в массиве Цена единицы старшего разряда? Сумма младшего и старшего разряда Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |