在C中,如何根据变量设置uint64_t的MSB



在C中,我有一个类型为uint64(x)的变量和一个类型为int(i)的变量。我需要将 x 的 MSB 更改为 i 的值(会有所不同)。我怎样才能做到这一点。请帮忙!

int i;
//
.. some code here that will set i to 0 or to 1. 
//
uint64_t x = 0xbeefcafebabecab1;

x 的二进制表示形式为:1011111011101111110010101111111010111010101111101100101010110001. 我需要将 MSB(在本例中最左边的 1)更改为 i 的当前值(例如 1 或 0) 我怎样才能做到这一点?我有一些想法,但我越来越困惑。任何建议都会非常有帮助。

很像这样:

#include <stdio.h>
#include <stdint.h>
int main() {
    uint64_t x = 0x0f9c432a673750a1;
    for (int i = 0; i < 2; ++i) {
        if ( i )
            x |= ((uint64_t) 1 << 63);
        else
            x &= ~((uint64_t) 1 << 63);
        printf ("i: %d x: %lxn", i, x);
    }
}

John

由于您只对MSB感兴趣,因此照顾好恩典很重要。为此,我为此调整了 JohnRowe 代码:

#include <stdio.h>
#include <stdint.h>
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
    #define _MSB_BIT_MASK_UINT64    (63)
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
    #define _MSB_BIT_MASK_UINT64    (0)
#else
    #error "Unknown endiness"
#endif
#define _MSB_MASK_UINT64        ((uint64_t) 1 << _MSB_BIT_MASK_UINT64)
#define _SET_MSB_UINT64(x)      (x | _MSB_MASK_UINT64)
#define _CLEAR_MSB_UINT64(x)    (x & ~_MSB_MASK_UINT64)
void printMessage(int i, uint64_t x)
{
    printf ("i: %d x: %llxn", i, x);
}
int main() {
    uint64_t x1 = 0x0123456789ABCDEF;
    uint64_t x2 = 0x8FEDCBA987654321;
    printMessage(0, _CLEAR_MSB_UINT64(x1));
    printMessage(1, _SET_MSB_UINT64(x1));
    printMessage(0, _CLEAR_MSB_UINT64(x2));
    printMessage(1, _SET_MSB_UINT64(x2));
}

BYTE_ORDER取决于 GCC。

相关内容

  • 没有找到相关文章

最新更新