通过数组

时间:2015-04-22 11:08:49

标签: c arrays

假设我们在数组中保存了8个字节,如:

char array[8];

所有这些都设置为零:

for (i = 0; i < 7; i++){
array[i] = 0x00;
}

如何将1从第一个LSB​​it转移到最后一个MSBit,如

0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x08
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x10

.....................................

0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00

这是我尝试过的,但结果不是我想要的:

    uint8_t buffer[8];

int index = 0 ;
for ( index = 0; index < 8; index++){
        buffer[index] = 0x00;
    } 
*buffer= 0x01;
for( index = 0 ; index < 64; index++){
        *buffer = *buffer<< 1 ;
}

更新

以下是我得到的一个例子:

#include <stdio.h>

int main (){
char buffer[2]={0x01, 0x00};
int i ;
for( i = 0 ; i < 12 ; i++){

  printf("0x %2X    %x \n",buffer[0], buffer[1]);
  *buffer <<= 1;
  }

}

输出是:

0x  1    0
0x  2    0
0x  4    0
0x  8    0
0x 10    0
0x 20    0
0x 40    0
0x FFFFFF80    0
0x  0    0
0x  0    0
0x  0    0
0x  0    0

我真的不明白0xFFFFFF80!

4 个答案:

答案 0 :(得分:2)

什么字节是“LS字节”,哪一个是“MS字节”可能不明显。一个8个字符的数组总是在内存中分配如下:

LS address               MS address
Byte 0, ...              Byte 7

所有CPU都适用。所以你问题中的0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01没有任何意义:你误解了数组是如何在内存中分配的。您在示例中显示的是如何在ms字节中取0位并将其移位到ls字节中的第7位。这可能没有任何意义。

然而,如果您尝试将此数组打印为64位整数,则值array[0]=1会在小端机器上为您提供0000000000000001,但{{{ 1}}在大端机器上。但是你的问题中没有任何内容表明你想要将数组打印为64位值,因此不清楚你实际上在想什么。

试试这个:

0100000000000000

答案 1 :(得分:1)

根据哈罗德的评论,只需携带1.所以,转移一个地方:

uint8_t carry = 0;
for( index = 7 ; index >= 0; index--){
    uint8_t nextCarry = buffer[index] >> 7;
    buffer[index] = (buffer[index] << 1) | carry;
    carry = nextCarry;
}

编辑:同样,让我觉得你的CPU 几乎肯定有一个原生的64位类型。在这种情况下,只需直接使用uint64_t而不是字节数组并执行variable <<= 1;

答案 2 :(得分:0)

由于您尝试将char数组视为单个64位对象,为什么不使用实际的64位对象?

union
{
    char array[8];
    uint64_t all;
} data;

int index = 0;
data.all = 0;
data.array[0] = 0x01;

for(index = 0; index < 64; index++)
{
    data.all = data.all << 1;
}

请注意,这假设您正在使用小型端机。

答案 3 :(得分:0)

所以我已经做到了,也许这不是最好的方式,但它有效,如果有人需要,我会很想分享它:

    #include <stdio.h>
#include <stdint.h>

int main (){
uint8_t buffer[8];
char* pChar = buffer;
uint8_t  carry  =0x01;
int i = 0;
short lock [8];

// Array  initialization

for ( i =0  ; i <8; i++){
   buffer[i] =0x00;
   lock[i] = 0x00;
}

pChar =buffer;



for( i = 0 ; i < 64 ; i++){
  *pChar = carry;
  printf(" 0x%2x   0x%2x   0x%2x  0x%2x  0x%2x 0x%2x 0x%2x  0x%2x \n",buffer[0], buffer[1],buffer[2],buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]);
   carry<<=1;
  if( i>=7 && lock[0]==0){
    *pChar = 0;
    pChar++;
    carry=0x01;
    lock[0]=1;
   }else if ( i>=15 && lock[1]==0) {
     *pChar = 0;
      pChar++;
      carry=0x01;
      lock[1]=1;
    }else if( i>= 23 && lock[2]==0){
     *pChar =0;
      pChar++;
      carry=0x01;
      lock[2] =1;
      }
      else if( i>= 31 && lock[3]==0){
        *pChar =0;
         pChar++;
         carry=0x01;
         lock[3] =1;
      }
       else if( i>=39 && lock[4]==0){
           *pChar =0;
           pChar++;
           carry=0x01;
           lock[4] =1;
       }
         else if( i>= 47 && lock[5]==0){
          *pChar =0;
          pChar++;
          carry=0x01;
          lock[5] =1;
         }
        else if( i>= 55 && lock[6]==0){
          *pChar =0;
          pChar++;
          carry=0x01;
          lock[6] =1;
        }



}

感谢您的帮助!

相关问题