Есть 16-ое число 0x12345678
И мне нужно изменить k(нумерация идёт справа налево) цифру числа на другую цифру
Например k=3;ch=9
Получаем 0x12345978
P.S. второй день мучаюсь не получается
Другие языки программирования и технологии
Поразрядные операции c++
в 16? можно занулить цифру и прибавить нужную, учитывая что в Hex цифра весит 4 двоичных разряда:
unsigned int b = 0x123, a = 0x6, k = 0 + 1;
printf("%x\n", b);
printf("%x\n", b & ~(a<<(4 * k)) | (a << (4 * k)) );
Собственно, если типы не известны (я не знаю как в этом случае получить число 11...11, но, хотя можно взять какое-то известное число разрядов право и работать с ними) , то просто дели на 16, получай цифры и формируй новое число как полином.
unsigned int b = 0x123, a = 0x6, k = 0 + 1;
printf("%x\n", b);
printf("%x\n", b & ~(a<<(4 * k)) | (a << (4 * k)) );
Собственно, если типы не известны (я не знаю как в этом случае получить число 11...11, но, хотя можно взять какое-то известное число разрядов право и работать с ними) , то просто дели на 16, получай цифры и формируй новое число как полином.
Street Boy
b & ~(0xF<<(4 * k)) | a << (4 * k)
16 число не может быть больше 4 разрядов, то бишь 0x1234
для твоего случая
a = 0x1234;
ch = 9;
ch = ch << (k-1)*8; // получаем число 0x0900
z = 0xF;
z = z << (k-1)*8; // получаем число 0x0F00
a = a | z; // получаем 0x1F34;
a = a ^ ch; // сложение по модулю получаем 0x1934;
для твоего случая
a = 0x1234;
ch = 9;
ch = ch << (k-1)*8; // получаем число 0x0900
z = 0xF;
z = z << (k-1)*8; // получаем число 0x0F00
a = a | z; // получаем 0x1F34;
a = a ^ ch; // сложение по модулю получаем 0x1934;
Самат Кудериев
Почему не может? даже 4х байтный int держит 8 разрядов
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <time.h>
#define Z cout << " k=" << k+1 << " ch=" << r << " => "; x=((x|n)^n)|(r<<(k*4))
using namespace std;
int main()
{ int j,k,m,i,t,r; char c;
unsigned long long n;
srand(time(NULL));
cout << hex;
for(;;)
{
if(getch()==27) break;
t=rand() % 4;
k=rand() % (2*(t+1));
r=rand() % 16;
n=15 << (k*4);
cout << "0x" << setw(t+1) << setfill('0') << fixed;
switch(t)
{
{
case 0:
unsigned char x;
x=rand();
cout << (unsigned)x;
Z;
cout << "0x" << (unsigned)x << endl;
break;
}
{
case 1:
unsigned short x;
x=rand();
cout << x;
Z;
cout << "0x" << x << endl;
break;
}
{
case 2:
unsigned int x;
x=rand(); x <<= 16; x+=rand();
cout << x;
Z; cout << "0x" << x << endl;
break;
}
{
case 3:
unsigned long long x;
x=rand(); x <<= 16; x+=rand(); x <<= 16; x+=rand(); x <<= 16; x+=rand();
cout << x;
Z;
cout << "0x" << x << endl;
break;
}
}
}
return 0;
}
#include <iomanip>
#include <conio.h>
#include <time.h>
#define Z cout << " k=" << k+1 << " ch=" << r << " => "; x=((x|n)^n)|(r<<(k*4))
using namespace std;
int main()
{ int j,k,m,i,t,r; char c;
unsigned long long n;
srand(time(NULL));
cout << hex;
for(;;)
{
if(getch()==27) break;
t=rand() % 4;
k=rand() % (2*(t+1));
r=rand() % 16;
n=15 << (k*4);
cout << "0x" << setw(t+1) << setfill('0') << fixed;
switch(t)
{
{
case 0:
unsigned char x;
x=rand();
cout << (unsigned)x;
Z;
cout << "0x" << (unsigned)x << endl;
break;
}
{
case 1:
unsigned short x;
x=rand();
cout << x;
Z;
cout << "0x" << x << endl;
break;
}
{
case 2:
unsigned int x;
x=rand(); x <<= 16; x+=rand();
cout << x;
Z; cout << "0x" << x << endl;
break;
}
{
case 3:
unsigned long long x;
x=rand(); x <<= 16; x+=rand(); x <<= 16; x+=rand(); x <<= 16; x+=rand();
cout << x;
Z;
cout << "0x" << x << endl;
break;
}
}
}
return 0;
}
Похожие вопросы
- C++ поразрядные операторы
- Особенности арифметических операций в C++, деление отрицательных чисел, вопрос ниже
- Как осуществить операцию сложения в с++ без операции присваивания ? int a=5; int b=6; int c=a+b; ( без "= ")
- Учусь програмировать на C++ по книге "C++ для чайников".Проблема.
- Помогите срочно C#
- Помогите исправить ошибку в программе (c++).
- Зачем нужен C++, если есть C?
- Ещё тупой вопрос по C++ :)
- Почему многие отдают предпочтение C++ а не C# ?
- Учу C++! Уже знаю: типы данных, циклы. условия, привидения и т. д учу 5дней. вот программа! Как норм за 5 дней?