我如何获得int的低8位?

Laz*_*Laz 23 c

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

Eli*_*sky 39

unsigned n = 8;
unsigned low8bits = n & 0xFF;
Run Code Online (Sandbox Code Playgroud)

请注意以下几点:

  1. 对于按位操作,请始终使用unsigned类型
  2. 可以使用&操作符的二进制掩码从数字中提取位
  3. 为了访问低8位,掩码是0xFF因为在二进制中它的低8位被打开而其余的是0
  4. 数字8的低8位是...... 8(暂时考虑一下)

要访问某个数字的某个位,请说k一下:

unsigned n = ...;
unsigned kthbit = (1 << k) & n;
Run Code Online (Sandbox Code Playgroud)

现在,kthbit如果k第0 位n为0则为0,2**k如果第k1位n为1 ,则为正数().


Mar*_*off 15

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

unsigned char c = (x & 0xFF);
Run Code Online (Sandbox Code Playgroud)

要访问第n个最低位,等式(x & (1 << n))(n为0表示最低有效位).结果为零表示该位清零,非零表示该位已设置.


njs*_*jsf 8

最好的方法是使用位逻辑运算符并使用适当的值.

所以对于低8位:

n & 0xFF; /* 0xFF == all the lower 8 bits set */
Run Code Online (Sandbox Code Playgroud)

或者作为一般规则:

n & ((1<<8)-1) /* generate 0x100 then subtract 1, thus 0xFF */
Run Code Online (Sandbox Code Playgroud)

您可以与位移运算符组合以获取特定位:

(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 */
Run Code Online (Sandbox Code Playgroud)