2016-03-28 4 views
0

6バイト長の符号なしcharがあります。文字の中に保存されている 値は次のとおりです。私がする必要がどのようなビット1と6、Cの符号なしの文字で2〜5グラブビット

Hex: 53167DFD95B7 
Binary: 010100 110001 011001 111101 111111 011001 010110 110111 

はキャプチャビット1とビット6は、次に小数にそれを変換しています。その後、ビット2-5をキャプチャして小数点に変換します たとえば、ビット1は0、ビット6は0、したがってバイナリ00は10進数です。次にビット2-5、バイナリ1010、または10進数10の場合次の6ビットのグループに割り当てる。

ビット1、ビット6がそうバイナリ11、または小数3 ビット2-5は、バイナリ1000、または小数8

ビット1は、ビット6が1であり、0であるので、バイナリ01、1、1 、または小数1 ビット2-5は、バイナリ1100または小数です。12

その他の6ビットグループについても同様です。

私はどのように私がマスキングする必要がありますか、これをシフトしています。これは一度に6ビットしかないので、私はいくつかの困難を抱えています。これについてのどんな助けも大いに感謝されるでしょう!あらかじめありがとうございます。

私はループの最後で推測する6ビットで

int getBitVal(unsigned char *keyStrBin, int keyIndex) { 

    int keyMod = keyIndex % 8; 
    int keyIn = keyIndex/8; 

    return (((keyStrBin[keyIn]) >> (7 - (keyMod))) & 1); 

} 
void getSValueMajor(char **tableS, unsigned char *f, unsigned char *sValue) { 
    int i, bitOne, bitSix; 
    int sCol; 

    for (i = 0; i < 8; i++) { 
     bitOne = getBitVal(f, 0); 
     bitSix = getBitVal(f, 5); 
     // Do something here to get only bits 2-5. Doesn't matter if its decimal. Just need the 4 bits. 

    } 

} 

病気シフトは次の6ビットに行くEDITが、変数にそれらの4ビットを読み出す方法がわかりません。

+0

関連します。http:/ /stackoverflow.com/questions/47981/how-do-you-set-clear-and-togglea-a-single-bit-in-cc?rq=1 –

+0

これはDESアルゴリズムの香りがあります。 – WhozCraig

+0

確かに。それは学校のプロジェクトのためです。 – TyrantUT

答えて

0

コメント者が実数を使用していないと述べたため、これを更新しました。私はこれを知っているが、ポイントは宿題をしている人に何かを残すことだった。

以下はきちんとした答えではありませんが、これをきちんと解決する方法を知っている人がいます。 2番目の方法では、私は変換しているものとして文字列を使用し、これを2進数に変換してそこからいくつかのビット操作を実行しました。いじるビットのすべてで

あなたはまた、ループを展開でき、常にあなたには、いくつかのシフトを避けるために、すべての8バイトのためにマスクを使用することができ、すなわち、物事をスピードアップする方法があるなど

#include <assert.h> 
#include <stdint.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
/* 
010100 == 00 , 1010 === 0 , 10 
110001 == 11 , 1000 === 3 , 8 
011001 == 10 , 1100 === 2 , 12 
111101 == 11 , 1110 === 3 , 14 
111111 == 11 , 1111 === 3 , 15 
011001 == 01 , 1100 === 1 , 12 
010110 == 00 , 1011 === 0 , 11 
110111 == 11 , 1011 === 3 , 11 
*/ 
int main(void) { 
    size_t x = 48; 
    size_t v = 91356068156855; 

    size_t one66 = 0; 
    size_t two55 = 0; 
    size_t bit1 = 0; 
    size_t bit6 = 0; 

    //Masks 
    size_t sixty3 = 63; 
    size_t thirty = 30; 

    size_t b[8]; 
    b[0] = (v & (sixty3 << 42ULL)) >> 42ULL; 
    b[1] = (v & (sixty3 << 36ULL)) >> 36ULL; 
    b[2] = (v & (sixty3 << 30ULL)) >> 30ULL; 
    b[3] = (v & (sixty3 << 24ULL)) >> 24ULL; 
    b[4] = (v & (sixty3 << 18ULL)) >> 18ULL; 
    b[5] = (v & (sixty3 << 12ULL)) >> 12ULL; 
    b[6] = (v & (sixty3 << 6ULL)) >> 6ULL; 
    b[7] = (v & (sixty3 << 0ULL)) >> 0ULL; 

    for(x = 0; x < 8;x++) { 
    one66 = 0; 
    two55 = 0; 
    bit1 = (b[x] & 1) > 0; 
    bit6 = (b[x] & 32) > 0; 
    one66 |= bit1 << 1; 
    one66 |= bit6 << 0; 
    two55 = (b[x] & thirty) >> 1; 
    printf("%zu %zu\n", one66, two55); 
    } 

// Method 2 using a string as the input... 
//     |  |  |  |  |  |  |  |  
    char  pat[]  = "010100110001011001111101111111011001010110110111"; 
    size_t patlength = strlen(pat); 
    for(x = 0; x < patlength; x += 6) { 
    size_t one6 = 0; 
    size_t two5 = 0; 
    if(pat[x] == '1') { 
     one6 |= 1ULL << 0; 
    } 
    if(pat[x + 5] == '1') { 
     one6 |= 1ULL << 1; 
    } 
    assert(one6 < 4); 
    if(pat[x + 1] == '1') { 
     two5 |= 1ULL << 3; 
    } 
    if(pat[x + 2] == '1') { 
     two5 |= 1ULL << 2; 
    } 
    if(pat[x + 3] == '1') { 
     two5 |= 1ULL << 1; 
    } 
    if(pat[x + 4] == '1') { 
     two5 |= 1ULL << 0; 
    } 
    assert(two5 < 16); 
    printf("%zu %zu\n", one6, two5); 
    } 
    return 0; 
} 
+0

私は入力が0と1の文字列ではないと信じています。バイトをそのような文字列に変換するには、あまりにも多くの計算量がかかります。 – HenryLee

+0

@HenryLee私は答えを実数でも更新しました。 – Harry

関連する問題