位操作-使用逐位生成二进制数(C++)
bit manipulation - Using Bitwise to make Binary numbers (C++)
我试图做的作业已经过了截止日期,所以你没有做我的作业。
为了学习,我想知道如何做一些事情。
我能够制作一个程序,使用掩码使用位运算符以二进制形式打印出1-32。
我使用的掩码的问题是,它还会打印出32个前导零,后面跟着二进制数字(例如,00000000000000000000000000000000001代表数字1(
这就是我的
# include <iostream>
#include <string>
using namespace std;
string naiveBitToChar( int num )
{
string st;
unsigned mask = 0x80000000;
if( num == 0 )
{
return "0";
}
while( ( num & mask ) )
mask >>= 1;
do
{
if ( num & mask )
{
st = st + "1";
}
else
{
st = st + "0";
}
mask >>= 1;
}
while( mask );
return st;
}
int main ( int argc, char* argv[] ) {
argc; argv;
for( int i = 0; i < 32; i++ )
cout << naiveBitToChar(i) << "n";
system ("pause");
}
我需要:
- 从字符串中删除前导零
- 在每个字符串中添加最小宽度为8的数字(例如00000010(
- 通过使用分隔符掩码(例如0000_1000(,在每4个数字后添加下划线
我是C++的新手,我的老师甚至不会看我的代码,请有人解释,并尽量保持它的基础。非常感谢。
这里有一个想法,使用一个标志来表示前导零位。如果位为1,请更改标志。仅当数字不是前导零时才打印该数字。
bool is_leading_zero = true;
while (/*... */)
{
// Convert bit to character in st
if (st == '1')
{
is_leading_zero = false;
}
if (!is_leading_zero)
{
cout << st;
}
}
如果从右到左扫描,则会更容易,因为您不需要删除前导零,只需在数字为0:时停止即可
std::string binary( unsigned n )
{
std::string bits;
for( unsigned mask = 1; true; mask <<=1 ) {
bits.insert( bits.begin(), n & mask ? '1' : '0' );
n &= ~mask;
if( !n ) break;
}
return bits;
}
或者更简单:
std::string binary( unsigned n )
{
std::string bits;
do {
bits.insert( bits.begin(), n & 1 ? '1' : '0' );
n >>= 1;
} while( n );
return bits;
}
要更改最小宽度,您需要稍微修改循环条件,添加unserscore可以简单到:
if( bits.length() % 4 ) bits.insert( bits.begin(), '_' );
内部环路
相关文章:
- visual在c++中将十进制数转换为二进制数
- 二进制数之和(使用C样式字符串)
- 以 10 c++ 为基数显示 1024 位二进制数
- 二进制数和位标志'x'
- C++ 二进制数到整数值的数组
- 二进制数组中最大连续 1 的起始和结束索引,以 C++ 为单位
- dev如何在C++中比较二进制数
- 递归回溯打印长度为N的二进制数的所有组合,而不使用循环
- 向后打印二进制数
- 使用位黑客反转二进制数
- 添加两个二进制数(整数数组)
- 从 0 到 n 的二进制数,具有相同数量的字符/
- 我通过迭代加法将二进制数转换为十进制并检查单个字符(请参阅代码)的方法有什么问题?
- 所有测试用例都将小数点转换为二进制数
- 尝试将二进制数组转换为十六进制C++然后打印结果
- 如何缩放二进制数组以保留值
- 计数二进制数中连续1的数量
- 使用堆栈将十进制数转换为二进制数
- C++ 添加二进制数 - 分段错误
- 使用 for 循环更改二进制数>十进制数