Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. Algorithms
  4. contiguous bits algorithm.

contiguous bits algorithm.

Scheduled Pinned Locked Moved Algorithms
algorithmstutorial
13 Posts 7 Posters 9 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    chandu004
    wrote on last edited by
    #1

    i have a 16 bit variable(unsigned short). now i want a best algorithm (function) which will do the following. 1.if contiguous bits at LSB are high then the function should return 1. for example, consider the following bit patterns 0000000001111111 or 0000111111111111 or 0000000000000001 2.if continuous bits at MSB are high then the function should return 2. for example, 1110000000000000 and so on. 3.other wise it should return 0 for the examoples such as 1010000000000011 0000011101010011 and so on thanks in advance. any more clarifications required, please get back.

    R C R L P 6 Replies Last reply
    0
    • C chandu004

      i have a 16 bit variable(unsigned short). now i want a best algorithm (function) which will do the following. 1.if contiguous bits at LSB are high then the function should return 1. for example, consider the following bit patterns 0000000001111111 or 0000111111111111 or 0000000000000001 2.if continuous bits at MSB are high then the function should return 2. for example, 1110000000000000 and so on. 3.other wise it should return 0 for the examoples such as 1010000000000011 0000011101010011 and so on thanks in advance. any more clarifications required, please get back.

      R Offline
      R Offline
      Russell
      wrote on last edited by
      #2

      Test the int with this constant variables if you want to not use a for loop with SHIFTs and bit-comparing. To return 1:

      1111111111111110
      1111111111111100
      1111111111111000
      ...
      1100000000000000
      1000000000000000

      to return 2:

      0000000000000001
      0000000000000011
      ...
      0111111111111111

      else return 0


      Russell

      1 Reply Last reply
      0
      • C chandu004

        i have a 16 bit variable(unsigned short). now i want a best algorithm (function) which will do the following. 1.if contiguous bits at LSB are high then the function should return 1. for example, consider the following bit patterns 0000000001111111 or 0000111111111111 or 0000000000000001 2.if continuous bits at MSB are high then the function should return 2. for example, 1110000000000000 and so on. 3.other wise it should return 0 for the examoples such as 1010000000000011 0000011101010011 and so on thanks in advance. any more clarifications required, please get back.

        C Offline
        C Offline
        cp9876
        wrote on last edited by
        #3

        There might be some nifty bit processing, but this should work with no more than about 6 comparisons (32 bits - 62 options) 8-bit version:

        int fn(int x)
           {
           switch (x)
              case 0x01:
              case 0x03:
              case 0x07:
              case 0x0F:
              case 0x1F:
              case 0x3F:
              case 0x7F:
                 return 1;
              case 0x80:
              case 0xC0:
              case 0xE0:
              case 0xF0:
              case 0xF8:
              case 0xFC:
              case 0xFE:
                 return 1;
              default:
                 return 0;
           }
        

        I think compilers are quite good at optimizing this sort of code, but I have never tested it so I'd be interested in comments.


        Peter "Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."

        C 1 Reply Last reply
        0
        • C cp9876

          There might be some nifty bit processing, but this should work with no more than about 6 comparisons (32 bits - 62 options) 8-bit version:

          int fn(int x)
             {
             switch (x)
                case 0x01:
                case 0x03:
                case 0x07:
                case 0x0F:
                case 0x1F:
                case 0x3F:
                case 0x7F:
                   return 1;
                case 0x80:
                case 0xC0:
                case 0xE0:
                case 0xF0:
                case 0xF8:
                case 0xFC:
                case 0xFE:
                   return 1;
                default:
                   return 0;
             }
          

          I think compilers are quite good at optimizing this sort of code, but I have never tested it so I'd be interested in comments.


          Peter "Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."

          C Offline
          C Offline
          chandu004
          wrote on last edited by
          #4

          thanks, the above logic is simple and works as of now. but the ultimate goal is to design a function in the following prototype. int GetWordStatus(int word,int word length) { //code here } if the word length is certainly 8 or 16 or 32, then teh above logic is appropriate. but the checking has to be done on the first specified number of bits. i.e. wordlength. hope i dont need to give any example, if required, i can. thanku.

          C R 2 Replies Last reply
          0
          • C chandu004

            thanks, the above logic is simple and works as of now. but the ultimate goal is to design a function in the following prototype. int GetWordStatus(int word,int word length) { //code here } if the word length is certainly 8 or 16 or 32, then teh above logic is appropriate. but the checking has to be done on the first specified number of bits. i.e. wordlength. hope i dont need to give any example, if required, i can. thanku.

            C Offline
            C Offline
            cp9876
            wrote on last edited by
            #5

            You should be able to extend this - do something like:

            const int hi1 = {0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0};
            
            int GetWordStatus(int word, int wordlength)
               {
               ASSERT(wordLength <= 8  &&  wordLength >= 0);
               int x = word & ~hi1[wordLength]; // may not be necessary depending on what data can be sent
               switch (x)
                  {
                  case 0x01:
                  case 0x03:
                  case 0x07:
                  case 0x0F:
                  case 0x1F:
                  case 0x3F:
                  case 0x7F:
                     return 1;
                  }
               x = word | hi1[wordLength];
               switch (x)
                  {
                  case 0x80:
                  case 0xC0:
                  case 0xE0:
                  case 0xF0:
                  case 0xF8:
                  case 0xFC:
                  case 0xFE:
                     return 2;
                  }
               return 0;
               }
            

            It may be a bit inefficient for small wordlengths, if it is a problem you should spend some time and make it better. -- modified at 6:57 Monday 3rd September, 2007 The reason I am suggesting a switch statement rather than a loop is that I thought the reason that in C/C++ the case values had to be constants was so that the compiler could order them and implement the switch as a simple binary search, so for N case statements there would be only log2(N) comparisons. I can't easily find a reference for this now - does anyone know if this happens?


            Peter "Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."

            R 1 Reply Last reply
            0
            • C chandu004

              thanks, the above logic is simple and works as of now. but the ultimate goal is to design a function in the following prototype. int GetWordStatus(int word,int word length) { //code here } if the word length is certainly 8 or 16 or 32, then teh above logic is appropriate. but the checking has to be done on the first specified number of bits. i.e. wordlength. hope i dont need to give any example, if required, i can. thanku.

              R Offline
              R Offline
              Russell
              wrote on last edited by
              #6

              In this case I think that the better solution is a general solution...so a loop like

              tmpword=word;
              for(i=0;i<wordlength;i++){
              if(tmpword == 1) return 1;
              if(tmpword & 1 ) tmpword >>=1;
              else break;
              }

              tmpword=word;
              for(i=0;i<wordlength;i++){
              if(tmpword == 0x80) return 2;
              if(tmpword & 0x80 ) tmpword <<=1;
              else break;
              }

              return 0;

              or somethig similar to this (I haven't tested the code...it is only an idea of what I'm meaning above...:~ )


              Russell

              1 Reply Last reply
              0
              • C cp9876

                You should be able to extend this - do something like:

                const int hi1 = {0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0};
                
                int GetWordStatus(int word, int wordlength)
                   {
                   ASSERT(wordLength <= 8  &&  wordLength >= 0);
                   int x = word & ~hi1[wordLength]; // may not be necessary depending on what data can be sent
                   switch (x)
                      {
                      case 0x01:
                      case 0x03:
                      case 0x07:
                      case 0x0F:
                      case 0x1F:
                      case 0x3F:
                      case 0x7F:
                         return 1;
                      }
                   x = word | hi1[wordLength];
                   switch (x)
                      {
                      case 0x80:
                      case 0xC0:
                      case 0xE0:
                      case 0xF0:
                      case 0xF8:
                      case 0xFC:
                      case 0xFE:
                         return 2;
                      }
                   return 0;
                   }
                

                It may be a bit inefficient for small wordlengths, if it is a problem you should spend some time and make it better. -- modified at 6:57 Monday 3rd September, 2007 The reason I am suggesting a switch statement rather than a loop is that I thought the reason that in C/C++ the case values had to be constants was so that the compiler could order them and implement the switch as a simple binary search, so for N case statements there would be only log2(N) comparisons. I can't easily find a reference for this now - does anyone know if this happens?


                Peter "Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."

                R Offline
                R Offline
                Russell
                wrote on last edited by
                #7

                cp9876 wrote:

                I can't easily find a reference for this now - does anyone know if this happens?

                Try to look the disassembly window opening it to the code you suggested ... :) I think that this shortcut is applyed from the compiler only if the number of case is greather then a specified number ... and only if you turn on that optimizations that is probally related with faster applications, but not applyed in small exe file dimension.


                Russell

                1 Reply Last reply
                0
                • C chandu004

                  i have a 16 bit variable(unsigned short). now i want a best algorithm (function) which will do the following. 1.if contiguous bits at LSB are high then the function should return 1. for example, consider the following bit patterns 0000000001111111 or 0000111111111111 or 0000000000000001 2.if continuous bits at MSB are high then the function should return 2. for example, 1110000000000000 and so on. 3.other wise it should return 0 for the examoples such as 1010000000000011 0000011101010011 and so on thanks in advance. any more clarifications required, please get back.

                  R Offline
                  R Offline
                  rihdus
                  wrote on last edited by
                  #8

                  try this vb code: Private Function GetWordStatus(ByVal word As Integer) As Integer Dim significantLength As Integer = (word & "").Length 'Calculate significant Length of number Dim temp As Integer temp = (2 ^ significantLength) - 1 If Convert.ToInt64(word, 2) = temp Then Return 1 Else Dim cntr As Integer temp = 2 ^ (significantLength - 1) cntr = (significantLength - 1) While cntr > 1 If Convert.ToInt64(word, 2) = temp Then Return 2 Else temp += 2 ^ (cntr - 1) End If cntr = cntr - 1 End While End If ' Return 0 End Function Its not the best but an alternative :)

                  Any systematic work reflects its significance for a long time. So let's discuss the best...

                  1 Reply Last reply
                  0
                  • C chandu004

                    i have a 16 bit variable(unsigned short). now i want a best algorithm (function) which will do the following. 1.if contiguous bits at LSB are high then the function should return 1. for example, consider the following bit patterns 0000000001111111 or 0000111111111111 or 0000000000000001 2.if continuous bits at MSB are high then the function should return 2. for example, 1110000000000000 and so on. 3.other wise it should return 0 for the examoples such as 1010000000000011 0000011101010011 and so on thanks in advance. any more clarifications required, please get back.

                    L Offline
                    L Offline
                    Luc Pattyn
                    wrote on last edited by
                    #9

                    Hi, it is much simpler than that. one spec is missing: what if input is zero ? THEORY (assume unsigned integers) 1. if all zeroes followed by all ones, then one more becomes a power of two 2. if all ones followed by all zeroes, then bitwise complement reverts to first case 3. a power of two has just one bit set; it can be tested in one line:

                    if (( x & (-x) )==x) then either x = zero or x = power of 2 !!!

                    CODE

                    if (x==0) return whatever you think is appropriate
                    if ((x&(-x))==x) return 1;
                    x=~x;
                    if ((x&(-x)==x) return 2;
                    return 3;

                    :)

                    Luc Pattyn [Forum Guidelines] [My Articles]


                    this weeks tips: - make Visual display line numbers: Tools/Options/TextEditor/... - show exceptions with ToString() to see all information - before you ask a question here, search CodeProject, then Google


                    R C 2 Replies Last reply
                    0
                    • L Luc Pattyn

                      Hi, it is much simpler than that. one spec is missing: what if input is zero ? THEORY (assume unsigned integers) 1. if all zeroes followed by all ones, then one more becomes a power of two 2. if all ones followed by all zeroes, then bitwise complement reverts to first case 3. a power of two has just one bit set; it can be tested in one line:

                      if (( x & (-x) )==x) then either x = zero or x = power of 2 !!!

                      CODE

                      if (x==0) return whatever you think is appropriate
                      if ((x&(-x))==x) return 1;
                      x=~x;
                      if ((x&(-x)==x) return 2;
                      return 3;

                      :)

                      Luc Pattyn [Forum Guidelines] [My Articles]


                      this weeks tips: - make Visual display line numbers: Tools/Options/TextEditor/... - show exceptions with ToString() to see all information - before you ask a question here, search CodeProject, then Google


                      R Offline
                      R Offline
                      Russell
                      wrote on last edited by
                      #10

                      You won:cool:


                      Russell

                      1 Reply Last reply
                      0
                      • L Luc Pattyn

                        Hi, it is much simpler than that. one spec is missing: what if input is zero ? THEORY (assume unsigned integers) 1. if all zeroes followed by all ones, then one more becomes a power of two 2. if all ones followed by all zeroes, then bitwise complement reverts to first case 3. a power of two has just one bit set; it can be tested in one line:

                        if (( x & (-x) )==x) then either x = zero or x = power of 2 !!!

                        CODE

                        if (x==0) return whatever you think is appropriate
                        if ((x&(-x))==x) return 1;
                        x=~x;
                        if ((x&(-x)==x) return 2;
                        return 3;

                        :)

                        Luc Pattyn [Forum Guidelines] [My Articles]


                        this weeks tips: - make Visual display line numbers: Tools/Options/TextEditor/... - show exceptions with ToString() to see all information - before you ask a question here, search CodeProject, then Google


                        C Offline
                        C Offline
                        cp9876
                        wrote on last edited by
                        #11

                        I knew there would be a clever bit twiddling answer to this - very neat!


                        Peter "Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."

                        1 Reply Last reply
                        0
                        • C chandu004

                          i have a 16 bit variable(unsigned short). now i want a best algorithm (function) which will do the following. 1.if contiguous bits at LSB are high then the function should return 1. for example, consider the following bit patterns 0000000001111111 or 0000111111111111 or 0000000000000001 2.if continuous bits at MSB are high then the function should return 2. for example, 1110000000000000 and so on. 3.other wise it should return 0 for the examoples such as 1010000000000011 0000011101010011 and so on thanks in advance. any more clarifications required, please get back.

                          P Offline
                          P Offline
                          polyhedron
                          wrote on last edited by
                          #12

                          fn(WORD w) { WORD mark=0x8000; if(w&mark) { mark >>= 1; while( (w&mark) && mark ) mark >>= 1; if(mark==0)//w must = 0xffff,return 1 or 2 return 2;//also can return 1 if(w&(mark-1)) return 0; else return 2; } else { mark >>= 1; while( ((w&mark)==0) && mark ) mark >>= 1; if( (w&(mark-1))==(mark-1) ) return 1; else return 0; } }

                          1 Reply Last reply
                          0
                          • C chandu004

                            i have a 16 bit variable(unsigned short). now i want a best algorithm (function) which will do the following. 1.if contiguous bits at LSB are high then the function should return 1. for example, consider the following bit patterns 0000000001111111 or 0000111111111111 or 0000000000000001 2.if continuous bits at MSB are high then the function should return 2. for example, 1110000000000000 and so on. 3.other wise it should return 0 for the examoples such as 1010000000000011 0000011101010011 and so on thanks in advance. any more clarifications required, please get back.

                            N Offline
                            N Offline
                            Nelek
                            wrote on last edited by
                            #13

                            Hi, what about...

                            int GetWordStatus(int word,int word length)
                            {
                            if (word == 0)
                            return 0;

                            int nHigh = word / pow (2, word_length);
                            int nLow = word % pow (2, word_length);

                            if (nHigh > nLow)
                            return 1;

                            else if (nHigh < nLow)
                            return 2;

                            else
                            return 3;
                            }

                            Greetings. -------- M.D.V. If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about? Help me to understand what I'm saying, and I'll explain it better to you ;)

                            1 Reply Last reply
                            0
                            Reply
                            • Reply as topic
                            Log in to reply
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes


                            • Login

                            • Don't have an account? Register

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • World
                            • Users
                            • Groups