在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的二进制表示形式为: 1011111011101111110010111111111010111010101111101100101010110001。我需要将MSB(本例中最左边的1)更改为i的当前值(比如一个或零) 我怎样才能实现这一目标?我有一些想法,但我变得更加困惑。 任何建议都会非常有帮助。
答案 0 :(得分: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: %lx\n", i, x);
}
}
约翰
答案 1 :(得分:0)
由于您只对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: %llx\n", 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有关。