Другие языки программирования и технологии

Поразрядные операции c++

Есть 16-ое число 0x12345678
И мне нужно изменить k(нумерация идёт справа налево) цифру числа на другую цифру
Например k=3;ch=9
Получаем 0x12345978
P.S. второй день мучаюсь не получается
в 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, получай цифры и формируй новое число как полином.
Street Boy
Street Boy
3 734
Лучший ответ
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;
Самат Кудериев Почему не может? даже 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;
}