Установка немного в uint64_t в c - PullRequest
0 голосов
/ 24 февраля 2019

Здравствуйте. Я бы хотел установить бит (значение) в позиции (слева направо).Вот мой код, который не работает для uint64_t (здесь он должен возвращать 0, а не 1), но когда я изменяю значения, чтобы он работал (с той же логикой) с uint8_t, он работает.Есть идеи?Пожалуйста.

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <inttypes.h>
int main()
{
    uint64_t x = (uint64_t)1;
    int pos =  63;
    bool value = 0;
    uint8_t z = x;
    z = z >> (64-pos);
    z = z << (64-pos);
    uint64_t a = (uint64_t)1;
    uint64_t d = (uint64_t)0;
    uint64_t y;
    uint64_t c = d;
    uint64_t b = x;
    b = b << (pos+1);
    b = b >> (pos+1);
    if (value == 1)
    {
        y = a;
        y = y << (63-pos);
    }
    else
    {
        y=d;
    }
    c = c|z|y|b;
    printf("%lld",c);
    return c;
}

РЕДАКТИРОВАТЬ: я думаю, что есть неправильно понято (я не достаточно ясно, мой плохой), на самом деле у меня есть х, который является uint64_t, и у меня есть int pos, который является позициейодного бита в х, и у меня есть значение, которое является логическим (1 или 0), и если значение равно 1, бит в позиции в х должен стать / остаться 1, а если значение равно 0, бит в позиции в х должен стать/ остаться 0.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Чтобы установить бит pos в value, вы используете

value |= ((uint64_t)1) << pos;

Что должен делать остальной код?

Обновленный вопрос см. В этом ответ .

0 голосов
/ 24 февраля 2019
//sets the bit pos to the value. if value is == 0 it zeroes the bit if value !=0 it sets the bit

void setbit(uint64_t *val, int bit, int value)
{
    if(value)
    {
        *val |= ((uint64_t)1 << bit);
    }
    else
    {
        *val &= ~((uint64_t)1 << bit);
    }
}

//sets nbits at location pos to the value of the first nbits of the value parameter.pos + nbits < 63
void setbits(uint64_t *val, int pos, int nbits, uint64_t value)
{
    uint64_t mask = ((uint64_t)((uint64_t)1 << nbits) - 1);

    *val &= ~(mask << pos);
    *val |= (val & mask) << pos;
}

И использование с bool

#include <stdbool.h>

uint64_t obj;
/* ... */
setbit(&obj, 5, true);  //sets the 5th bit to 1
setbit(&obj, 7, false);  //sets the 7th bit to 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...