计算机的最小单位是bit,但是程序读的最小单位为字节,也就是8bit。我用fopen()。fread()读进来的数据文件。现在想进行数据的bit位判断。比如:读进一个DWORD类型的数据,也就是32bit。我想判断这32bit里面有没有长1。有几个长1,第一个长1在这32bit的第几位,然后,从第一个长1的位置截断,之前的内容不要,重新写入一个文件中。我的办法就是用这32bit和1、2、4、8。。分别与运算,看是否仍然等于1、2、4、8。。但是,如何按照要求截断却不能做到。希望朋友们提供除了思路以外,最好加上程序代码,或者关键的函数。
不知道我阐述的问题够不够具体,清晰,希望得到帮助。分数不够我可以加,谢谢。
不知道我阐述的问题够不够具体,清晰,希望得到帮助。分数不够我可以加,谢谢。
解决方案 »
- VC 中怎样把JP2(JPEG2000)的图像数据转解压成raw_data,再转换成bmp格式并显示或存盘
- 为什么点击一个按钮的时候,系统会给按钮发送WM_CTRLCOLOR消息?
- 怎样替换工具条的图片?请帮帮忙
- win32:ComboBox下拉表怎么显示不出来?
- 浏览器显示
- 谁知道汉字字库压缩算法(好的算法),请进!
- dom问题,急用!!!!
- 如何得到盘符?C:,D:,E:???
- 请问在VC中使用ODBC怎样访问Oracle库中的BLOB或BFILE字段?
- 我对串口进行读写,使用API函数,请教ReadFile()函数的详细用法
- 请问如何对记录集(数据库中的一个表)写一个函数按某一个字段从小到大进行排序排序??
- 如何在SQL server 数据库中提取image字段的内容?
可以进行移位,算法实现你指的长1是几个1?没说明白呀,给你个思路吧
//实现////选全部读进内存,起名叫 short R ,长度为l ,长1 为V不超过 16个1如超过请自行改以下代码
int i=0,t=0;
do
{
t=*(int*)&R[i] //这里要注意 溢出问题
for(int ii=0;ii<16;ii++)
{
if(t&V==V)
{
//你的存储代码
break;
}else{
t>>1;
}
}
}while(i++<l);
比如: 6>>1 == 3
0110 11 6>>2 == 1
0110 1
1、10010110 01000111 11100100 00110010
这种情况下:第2个字节的第6bit开始到第3个字节的第3bit就是我想要的那个长1标志。我想要从第2个字节的第5bit开始截断。在这之前的都不要。
2、10010110 01000110 11100100 00110111(这是第一个32bit,我这里称作dword1吧)
11101001 10010110 01000110 11100100 (这是在上面那32bit后面的32bit,我这里称作dword2吧)
dword1中并没有我想要的6bit长1。但是末尾的3bit长1和dword2开头的3bit长1加一起是我想要的6bit长1。我就要从dword1中第4个字节的第5bit截断,在这之前的不要。
3、和第2中差不多。只不过,dword1和dword2互换一下进行判断。
这样说不知道够不够清晰?
byte bTest = 0b1000000;
和连续一的个数
int nOne = 0;
DWORD txt[Len];
for(int i=0;i<Len*8;i++)
{
if(txt[Len] & bTest) nOne ++;
else nOne = 0;//根据一的个数处理 if(bTest == 0b00000001) bTest = 0b10000000;
else bTest >> 1;
}
V 就是你的长 1 让V=64 你看看
short R 是你的文件,如不是2的倍数补齐就行了
就说说长六位的吧:六位全是1就是16进制的0x3f
unsigned long us_data=....
for(;;;)
if( (us_data>>i)&0x3F == 0x3F )
{ ...... }
你的这段程序确实可以实现计算包含几个1.但是,却不能判断长一.也没有截断的功能,还有上下两个32bit之间的长1