使用逐位运算符提取十六进制数字



给定int a=0x1234使用逐位操作打印4321,我很喜欢这样做。

#include<bits/stdc++.h>
using namespace std;
int main(){
int val = 0x1234;
int mask = 0x000F;
///trying to print 4
int ans = val&mask;
cout<<ans<<endl;
val=val>>4;
ans = val&mask;
cout<<ans<<endl;
val=val>>4;
ans=val&mask;
cout<<ans<<endl;
}

我认为,这看起来肯定比你的好:

#include <iostream>
int main() {
unsigned val = 0x12AB;
std::cout << std::hex << std::uppercase;
do std::cout << (val & 0xF) << 'n';
while (val >>= 4);
// std::cout << std::nouppercase << std::dec;
}

打印:

B
A
2
1


要打印小写字符,只需删除std::uppercase即可
要将A打印为10,将B打印为11。。。,完全去除线路CCD_ 6
如果要以常规格式打印代码中的其他数字,请取消对行7的注释。

更新:从while切换到do-while以处理val = 0

这对我有效:

#include <stdio.h>
int main()
{
static char hex[] = "0123456789abcdef";
int a = 0x1234abd;
while( a > 0 ) {
printf( "%c", hex[a & 0xf] );
a >>= 4;
}
}

输出:

$ ./a.out 
dba4321

这是对brc-dd注释的回答——如果我从头开始写这个代码,我会使用将数字输出到字符串

std::stringstream stream;
stream << std::hex << int_value;
std::string hex( stream.str() );

然后使用反转字符串

string reversed(hex.rbegin(), hex.rend());

但OP希望使用位操作。。。。

我认为您应该再声明一个变量,并将其初始化为Zero,然后在每次打印或计算位值时将anspow(16,i++)相乘。

请尝试以下代码。。我用g++编译并运行了它。

#include <bits/stdc++.h>
using namespace std;
int main()
{
int val = 0x1234;
int mask = 0x000F;
///trying to print 4
int i = 0;
int ans = val & mask;
cout << ans * pow(16, i++) << endl;
val = val >> 4;
ans = val & mask;
cout << ans * pow(16, i++) << endl;
val = val >> 4;
ans = val & mask;
cout << ans * pow(16, i++) << endl;
}

最新更新