计算机的最小单位是bit,但是程序读的最小单位为字节,也就是8bit。我用fopen()。fread()读进来的数据文件。现在想进行数据的bit位判断。比如:读进一个DWORD类型的数据,也就是32bit。我想判断这32bit里面有没有长1。有几个长1,第一个长1在这32bit的第几位,然后,从第一个长1的位置截断,之前的内容不要,重新写入一个文件中。我的办法就是用这32bit和1、2、4、8。。分别与运算,看是否仍然等于1、2、4、8。。但是,如何按照要求截断却不能做到。希望朋友们提供除了思路以外,最好加上程序代码,或者关键的函数。
不知道我阐述的问题够不够具体,清晰,希望得到帮助。分数不够我可以加,谢谢。

解决方案 »

  1.   

    另外,除了按照每位的与运算进行判断以为,是否还有其它的算法?除此之外,在这个32bit里面末尾的长1可能与下一个32bit里首部的1或者长1是一起的。也就是还要进行2个DWORD之间的长1拼接。当然了,我这里用的是DWORD.如果用其它的类型更加有效,也可以,只是我还没有想通用其它的类型和用这个有什么本质区别,因为同样涉及到这些问题,只是把问题缩短了而已。
      

  2.   

    改进的算法,
    可以进行移位,算法实现你指的长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);
      

  3.   

    用移位操作符 >> (<<) 可以判断每位.
    比如: 6>>1  == 3
          0110     11       6>>2  == 1
          0110     1
      

  4.   

    我想大家可能没有完全明白我的意思!我举个例子。比如我读进一个32bit的数据,这里面就要分三种情况:
    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互换一下进行判断。
    这样说不知道够不够清晰?
      

  5.   

    我的思路是设置一个标志符
    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;
    }
      

  6.   

    上面我给你写的已经能实现这个功能了
    V 就是你的长 1 让V=64 你看看
    short R  是你的文件,如不是2的倍数补齐就行了
      

  7.   

    32bit的就放在unsigned long 里面吧。
    就说说长六位的吧:六位全是1就是16进制的0x3f
    unsigned long us_data=....
    for(;;;)
     if( (us_data>>i)&0x3F == 0x3F )
     { ...... }
      

  8.   

    moloto2004() :
    你的这段程序确实可以实现计算包含几个1.但是,却不能判断长一.也没有截断的功能,还有上下两个32bit之间的长1