C++ 按位读取数据 / 设置数据某个二进制位

本文介绍了如何使用模板函数实现按位读取C++变量的二进制位并存入vector,以及设置指定二进制位的方法。通过MyI16、MyI32和MyI64结构体展示了对不同数据类型的位操作示例,包括整数和结构体的位操作实践。

按位读取 结果存入Vector

template< class _Type >
void ReadBit( _Type &_src, vector< int > &_vdest ) {
	_vdest.clear();
	char *p = ( char * )&_src;
	for( int i = sizeof( _src ) - 1; i >= 0; i-- ) {
		for( int j = 7; j >= 0; j-- ) {
			if( ( *( p + i ) & ( 1 << j ) ) == ( 1 << j ) ) {
				_vdest.push_back( 1 );
			} else {
				_vdest.push_back( 0 );
			}
		}
	}
}

设置某个二进制位

template< class _Type >
bool SetBit( _Type &_src, int _bit_idx, bool _bit ) {
	if( _bit_idx > sizeof( _src ) * 8  ) {
		//不属于你的数据不能瞎搞。
		return false;
	}
	char *p = ( char * )&_src + ( _bit_idx - 1 ) / 8;
	if( _bit ) {
		*p = *p | ( 1 << ( ( _bit_idx - 1 ) % 8 ) );
	} else {
		*p = *p & ~( 1 << ( ( _bit_idx - 1 ) % 8 ) );
	}
	return true;
}
电脑上数据存在内存中的方式和人直观的方式是相反的。人的感官高位在前低位在后 电脑则是低位在前高位在后 so倒过来读才符合人的感官。

完整程序 测试下函数结果 

#include <iostream>
#include <vector>
using namespace std;

//从高到低顺序按位取值 存入vector
template< class _Type >
void ReadBit( _Type &_src, vector< int > &_vdest ) {
	_vdest.clear();
	char *p = ( char * )&_src;
	for( int i = sizeof( _src ) - 1; i >= 0; i-- ) {
		for( int j = 7; j >= 0; j-- ) {
			if( ( *( p + i ) & ( 1 << j ) ) == ( 1 << j ) ) {
				_vdest.push_back( 1 );
			} else {
				_vdest.push_back( 0 );
			}
		}
	}
}

//设置数据位 _bit_idx 从1开始 
template< class _Type >
bool SetBit( _Type &_src, int _bit_idx, bool _bit ) {
	if( _bit_idx > sizeof( _src ) * 8  ) {
		return false;
	}
	char *p = ( char * )&_src + ( _bit_idx - 1 ) / 8;
	if( _bit ) {
		*p = *p | ( 1 << ( ( _bit_idx - 1 ) % 8 ) );
	} else {
		*p = *p & ~( 1 << ( ( _bit_idx - 1 ) % 8 ) );
	}
	return true;
}

union Myi16 {
	struct {
		char LowByte;
		char HighByte;
	};
	short _Short;
};
union MyI32 {
	struct {
		Myi16 Low16;
		Myi16 High16;
	};
	int i32;
};
union MyI64 {
	struct {
		MyI32 Low32;
		MyI32 High32;
	};
	_int64 i64;
};

//测试
vector< int > vret;
void vprint() {
	for( unsigned int i = 0; i < vret.size(); i++ ) {
		cout << vret[ i ];
		if( ( i + 1 ) % 4 == 0 ) cout << " ";
			
	}
	cout << endl;
}

int main()
{
	//C++ 基础类型int测试
	int n = 0;
	cout << "初始值全0:" << endl;
	ReadBit( n, vret );
	vprint();
	cout << "第8位设置成1:" << endl;
	SetBit( n, 8, true );
	ReadBit( n, vret );
	vprint();
	cout << endl;

	n = 0xFFFFFFFF;
	cout << "初始值全1:" << endl;
	ReadBit( n, vret );
	vprint();
	cout << "第8位设置成0:" << endl;
	SetBit( n, 8, false );
	ReadBit( n, vret );
	vprint();
	cout << endl;
	
	//搞个结构试试
	MyI64 i64;
	i64.i64 = 0;
	cout << "初始值全0:" << endl;
	ReadBit( i64, vret );
	vprint();
	cout << "第30位设置成1:" << endl;
	SetBit(i64, 30, true );
	ReadBit( i64, vret );
	vprint();
	cout << endl;

	i64.i64 = 0xFFFFFFFFFFFFFFFF;
	cout << "初始值全1:" << endl;
	ReadBit( i64, vret );
	vprint();
	cout << "第32位设置成0:" << endl;
	SetBit( i64, 32, false );
	ReadBit( i64, vret );
	vprint();
	cout << endl;
	system( "pause" );
    return 0;
}

运行结果

 OK!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值