给定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
,然后在每次打印或计算位值时将ans
与pow(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;
}