0 / 0 / 0
Регистрация: 29.05.2016
Сообщений: 1
1

Создать 2 переменные, одна из которых хранит 2 старших бита исходного числа, другая 2 младших бита этого числа

29.05.2016, 17:41. Показов 1149. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано число. Создать 2 переменные, одна из которых хранит 2 старших бита исходного числа, другая 2 младших бита этого числа. код частично рабочий. Помогите пожалуйста!
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
36
37
38
#include<iostream>
#include<math.h>
using namespace std;
void perevod(unsigned char n);
void perevod(unsigned char n)
 
 
    {
        if (n>=2)
            perevod(n >> 1);
 
        cout << (n & 1);
    }
 
    
 
 
int main()
{
    unsigned char A = 43, B, C; 
 
    cout << "A= " << (double)A << endl;
    perevod(A);
    cout << endl;
 
    B = A & 1;
    C = A & 3;
 
    cout << "B= " << (double)B << endl;
    perevod(B);
    cout << endl;
 
    cout << "C= " << (double)C << endl;
    perevod(C);
    cout << endl;
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2016, 17:41
Ответы с готовыми решениями:

Извлечь из байта четыре старших и четыре младших бита?
Как извлечь из байта четыре старших и четыре младших бита? На Си это выглядит вот так:...

Как перехватить координаты бита на картинке в момент обнаружения этого бита
есть картинка .Блокируем её в памяти.Пробегаемся по битам.Как перехватить координаты бита на...

Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с первого бита
Ввести целое A. Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с...

Дано целое число. Проинвертировать младшие четыре бита этого числа
Помогите пожалуйста дописать программу. Кусочек у меня есть в 2 варианта. Первый вариант я ввожу...

1
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
30.05.2016, 10:31 2
Если делать по-упоротому, то можно так:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <cstdint>
#include <cstring>
#include <string>
#include <type_traits>
 
enum
{
  endian_big,
  endian_little,
  endian_pdp,
  endian_unknown
};
 
int CheckEndianness(void)
{
  static const uint32_t endianness = 0xA1B2C3D4;
 
  switch (((unsigned char*)&endianness)[0])
  {
  case 0xD4:
    return endian_little;
  case 0xA1:
    return endian_big;
  case 0xB2:
    return endian_pdp;
  default:
    return endian_unknown;
  }
}
 
template<typename T>
std::pair<uint8_t, uint8_t> Extract(T value)
{
  static char isArgPodType[(std::tr1::is_fundamental<T>::value &&
    !(std::tr1::is_void<T>::value)) ? 1 : -1];
 
  int endianness = CheckEndianness();
 
  uint8_t bytes[sizeof(T)];
 
  memcpy((void*)bytes, (void*)&value, sizeof(T));
 
  uint8_t firstBits = 0;
  uint8_t lastBits = 0;
 
  switch (endianness)
  {
  case endian_little:
    {
      firstBits = bytes[sizeof(T) - 1] & 0xC0;
      lastBits = bytes[0] & 0x03;
      break;
    }
  case endian_big:
    {
      firstBits = bytes[0] & 0xC0;
      lastBits = bytes[sizeof(T) - 1] & 0x03;
      break;
    }
  case endian_pdp:
    {
      firstBits = bytes[1] & 0xC0;
      lastBits = bytes[sizeof(T) - 2] & 0xC0;
      break;
    }
  default:
    {
      throw std::runtime_error("Invalid system endianness.");
    }
  };
 
  return std::make_pair(firstBits, lastBits);
}
 
template<class T>
std::string ToBin(const T& N)
{
  T temp = N;
 
  std::string bin;
 
  for (unsigned int i = 1; i <= 8 * sizeof(T); i++)
  {
    if (temp & 1) bin = std::string("1") + bin;
    else bin = std::string("0") + bin;
 
    temp = temp >> 1;
  }
 
  return bin;
}
 
int main()
{
  double d = 3.0;
  float f = 127.54f;
  int a = 166;
  char c = 126;
 
  std::pair<uint8_t, uint8_t> result;
 
  result = Extract<double>(d);
  std::cout << d << ":" << std::endl << ToBin<uint8_t>(result.first) << std::endl << ToBin<uint8_t>(result.second) << std::endl;
 
  result = Extract<float>(f);
  std::cout << f << ":" << std::endl << ToBin<uint8_t>(result.first) << std::endl << ToBin<uint8_t>(result.second) << std::endl;
 
  result = Extract<int>(a);
  std::cout << a << ":" << std::endl << ToBin<uint8_t>(result.first) << std::endl << ToBin<uint8_t>(result.second) << std::endl;
 
  result = Extract<char>(c);
  std::cout << c << ":" << std::endl << ToBin<uint8_t>(result.first) << std::endl << ToBin<uint8_t>(result.second) << std::endl;
 
  return 0;
}
З.Ы. коллеги, посмотрите пожалуйста рестрикт на типы параметров шаблона в функции Extract. Как проверить на nullptr_t? Что-то не соображу.
0
30.05.2016, 10:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2016, 10:31
Помогаю со студенческими работами здесь

Функция, которая для заданного числа рассчитывает позицию первого слева (старшего) нулевого бита числа
Написать функцию, которая для заданного числа х рассчитывает позицию первого слева (старшего)...

Обнулить 2 старших бита во всех байтах файла
По заданному двоичному файлу с произвольным числом и содержанием байтов создать новый двоичный ...

Переписать три младших бита регистра ВХ на место 10,11 и 12 битов
Переписать три младших бита регистра ВХ на место 10,11 и 12 битов.

В 4 старших бита каждого элемента массива занести единицы
Массив состоит из 18 элементов размером в байт.В 4 старших бита каждого элемента массива занести...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru