2010-07-17 341 views
19

可以说我有一个int变量n = 8。在大多数机器上这将是一个32位的值。我怎样才能得到这个二进制的低8位(最低字节)?另外我怎样才能访问每一个位,找出它是什么? 我的问题是有关至C如何获取int的低8位?

回答

30
unsigned n = 8; 
unsigned low8bits = n & 0xFF; 

注意的几件事情:

  1. 对于位运算,始终使用unsigned类型
  2. 位可以使用二进制掩蔽与&操作
  3. 要进入低的数字提取8位掩码是0xFF,因为在二进制中它有低8位打开,其余0位数字的低8位8 ... 8(想想了一会儿)

要访问一些特定的比特,说k个位:

unsigned n = ...; 
unsigned kthbit = (1 << k) & n; 

现在,kthbit会如果0的nk第i位是0,并且一些正数(2**k)如果nk个位为1

15

使用按位算术屏蔽掉最低8位:

unsigned char c = (x & 0xFF); 

要访问的第n个最低位时,方程是(x & (1 << n))(零n表示至少显著位) 。零的结果表示该位清零,而非零表示该位被置位。

2

可以Ť EST如果一个特定的位被设置在使用< <和&,即数:如果第四位被设置或不

if (num & (1<<3)) ...

将测试。

同样,您可以通过使用&以及仅设置最低8位的数字(即num & 255num & 0xFF(十六进制))来提取最低8位(作为整数)。

7

最好的方法是使用具有适当值的位逻辑运算符&。

所以对于低8位:

n & 0xFF; /* 0xFF == all the lower 8 bits set */ 

或者作为一般规则:

n & ((1<<8)-1) /* generate 0x100 then subtract 1, thus 0xFF */ 

您可以用移位操作结合起来,得到一个特定的位:

(n & (1<<3))>>3; 
    /* will give the value of the 3rd bit - note the >>3 is just to make the value either 0, or 1, not 0 or non-0 */ 
+0

第一位表示“0”位还是“第1位”? – 2014-08-22 16:54:46