2015-03-23 3 views
0

У меня есть переменная uint32_t, и я хочу изменить randombly первые 10 менее значимых бит (0-9), а затем, по-прежнему произвольно, я хочу изменить биты с 10-го по 23-й. Я написал эту простую программу на C++ и работает для первых 10 бит, но не для остальных. Я не могу понять, почемуизменить бит переменной uint32_t

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <iostream> 
#include <math.h> 

using namespace std; 

void printuint(uint32_t value); 

int main(){ 

    uint32_t initval=0xFFFFFFFF; 
    uint32_t address; 
    uint32_t value; 
    uint32_t final; 


    address=rand()%1024; 
    address<<=23; 
    printf("address \n"); 
    printuint(address); 

    printf("final\n"); 
    final = (initval & address); 
    printuint(final); 


    return 0; 
} 

void printuint (uint32_t value){ 

    while (value) { 
     printf("%d", value & 1); 
     value >>= 1; 
    } 
    cout<<endl; 
} 

Добавление этого

value = rand() % 16384; 
    printuint(value); 

и необходимости модифицировать final = (initval & address) & value;

+1

Это немного сбивает с толку - где вы добавляете код после того, как «Добавление этого»? Каковы ожидаемые и фактические результаты (используйте тестовые числа вместо rand())? – ysap

+1

Функция 'printuint()' печатает биты в порядке lsb-on-left. Обычно вы ставите lsb справа. Это то, что вы действительно хотите? Кроме того, из-за сдвига влево на 23 бит, вы получите серию ведущих нулей перед вашим фактическим 10-битным числом. – ysap

+0

Вы просто пропустили семя генератора псевдослучайных чисел, вызывающего ['srand()'] (http://stackoverflow.com/questions/4926622/how-to-generate-different-random-number-in-a-loop -в-с)? –

ответ

0

Вот пример листать случайных битов:

int main(void) 
{ 
    srand(time()); 
    unsigned int value = 0; 
    for (unsigned int iterations = 0; 
     iterations < 10; 
     ++iterations) 
    { 
    unsigned int bit_position_to_change = rand() % sizeof(unsigned int); 
    unsigned int bit_value = 1 << bit_position_to_change; 
    value = value^bit_value; // flip the bit. 
    std::cout << "Iteration: " << iterations 
       << ", value: 0x" << hex << value 
       << "\n"; 
    } 
    return EXIT_SUCCESS; 
} 

исключающее ИЛИ функция, представленный operator ^, хорош для перевернутых битов.

Другой метод заключается в заменить бит:

unsigned int bit_pattern; 
unsigned int bit_mask; // contains a 1 bit in each position to replace. 
value = value & ~bit_mask; // Clear bits using the mask 
value = value | bit_pattern; // Put new bit pattern in place. 
0

К сожалению, я решил свою проблему с большим терпением.

То, что я имел в виду, чтобы сделать это:

uint32_t initval; 

    uint32_t address(1023); 
    bitset<32> bits(address); 
    cout << bits.to_string() << endl; 

    uint32_t value(16383); 
    value<<=10; 
    bitset<32> bitsvalue(value); 
    cout << bitsvalue.to_string() << endl; 

    initval = address | value; 
    bitset<32> bitsinit(initval); 
    cout << bitsinit.to_string() << endl; 

    return 0; 

 Смежные вопросы

  • Нет связанных вопросов^_^