我一直不了解C中对整数的位操作。假设我有数字13。其二进制表示形式是1101。如何将钻头设置在第二位置?我如何清除位?这是我到目前为止编写的用于设置该位的函数:int setBit(int data, int pos, int val){ if (val==1) data |= (1U << (pos - 1)); else data ^= (1U << (pos-1)); return data;}这样可以正常工作吗? 最佳答案 设置,清除和切换位状态非常简单:inline void bit_set (unsigned long *bf, unsigned char n){ *bf |= (1 << n); }inline void bit_clear (unsigned long *bf, unsigned char n){ *bf &= ~(1 << n); }inline void bit_toggle (unsigned long *bf, unsigned char n){ *bf ^= (1 << n); }注意:位域和上面的函数都是从零开始的(即,最低有效位是bit 0而不是bit 1),因此,如果要清除,设置或从右边切换第二个位(bit index 1,或2's bit (binary)从右到左计数),则传递bit 2。上面功能中的bit index of 1是n。以下是快速参考: +-----+-----+-----+-----+-----+-----+-----+-----+bit index | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +-----+-----+-----+-----+-----+-----+-----+-----+binary | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | +-----+-----+-----+-----+-----+-----+-----+-----+这是在bit index(二进制2的位)上使用的用法的简单示例:#include <stdio.h>#include <stdlib.h>#define WDSZ 64/* bit functions */inline void bit_set (unsigned long *bf, unsigned char n) { *bf |= (1 << n); }inline void bit_clear (unsigned long *bf, unsigned char n) { *bf &= ~(1 << n); }inline void bit_toggle (unsigned long *bf, unsigned char n) { *bf ^= (1 << n); }/* simple return of binary string */char *binstr (unsigned long n);int main (int argc, char **argv) { unsigned long bf = (argc > 1) ? strtoul (argv[1], NULL, 10) : 13; printf ("\n original value : %3lu (%s)\n", bf, binstr (bf)); bit_set (&bf, 1); printf (" set bit 1 : %3lu (%s)\n", bf, binstr (bf)); bit_clear (&bf, 1); printf (" clear bit 1 : %3lu (%s)\n", bf, binstr (bf)); bit_toggle (&bf, 1); printf (" toggle bit 1 : %3lu (%s)\n\n", bf, binstr (bf)); return 0;}/* simple return of binary string */char *binstr (unsigned long n) { static char s[WDSZ + 1] = {0}; char *p = s + WDSZ; while (n) { p--; *p = (n & 1) ? '1' : '0'; n >>= 1; } return p;}输出量$ ./bin/bitsetcleartoggle original value : 13 (1101) set bit 1 : 15 (1111) clear bit 1 : 13 (1101) toggle bit 1 : 15 (1111)
09-06 17:10