繁体   English   中英

C-中的位移位是i吗?

[英]Bits Shift in C- is the i bit on?

我正在尝试了解以下功能,该功能确定是否打开:

int isBitISet( char ch, int i )
{
   char mask = 1 << i ;
   return mask & ch ;
}

首先,为什么我要得到一个字符? 对于ch=abcdefghi=5该函数假定从右(?) d返回第五位。 所以mask=00000001<<5=00100000 00100000 & abcdefgh = 00c00000

您能解释一下我们是怎么得到char的,而我们可以进行所有这些转换而无需任何强制转换吗? 为什么我们没有得到第五位?为什么返回值实际上是指示位是否打开的指示?

编辑:“ abcdefg”只是位的符号,我的意思并不是要以char类型表示字符串。

我以前将char视为'a'而不是实际的8位,因此这可能是我第一个问题的答案。

它不会给你第五位。 二进制数从2 0开始,因此第一位实际上是用0而不是1索引的。 它将给您返回第六位。

例子:

ch & (1 << 0); // first bit
ch & (1 << 1); // second bit
ch & ((1 << 3) | (1 << 2)); // third and fourth bit.

同样,字符只是数字的解释。 在大多数计算机上,它的大小为8位,您可以将其解释为无符号值(0到255)或有符号值(-128到127)。 因此,基本上它是一个范围非常有限的整数,因此您可以进行移位而不进行转换。

同样,只有在未设置给定位的情况下,函数才会返回等于零的整数值。 否则,它是一个非零值。

该函数可能返回一个char,因为它处理的输入也只是一个char。 您当然不能传递ch = abcdefgh,因为那将是8个字符的字符串。

您可以对字符进行移位,因为C允许这样做。 char只是8位整数类型,因此无需禁用它。

您是正确的事实,如果字母a,b等是数字二进制表示形式中的位,则isBitISet(abcdefgh, 5)返回00c00000 返回值不是the fifth bit from the right ,它是与输入中相同的数字,但除第五位外的所有位都为零。 您还必须记住,位的编号从零开始,因此第五位是c ,就像第零位是h

本示例使用整数类型表示布尔值。 这在C99之前的C代码中很常见,因为C没有bool类型。 如果将返回值视为布尔值,请记住所有非零值均为true,零值为false。 因此,如果设置了位iisBitISet的输出对于C为true,否则为false。

您现在应该知道,在计算机中,所有内容都以0开头。也就是说,第5位实际上是第六位(而不是第五位)。

您的分析实际上是正确的,如果给它abcdefgh5 ,则得到00c00000

当您执行“与”操作时:

return mask & ch;

由于mask类型为int ,因此ch也将自动转换为int (与许多其他运算符相同)。 这就是为什么您不需要显式强制转换。

最后,此函数的结果格式为0..0z0..0。 如果z ,您要检查的位为0,则此值为0,只要涉及if ,则该值为false。 如果不为零,则if为true。

  1. 首先,此函数不返回第i位,但会告诉您该位是打开还是关闭。

  2. char mask的使用取决于实现方式。 简单地定义一个8位掩码,因为要应用此掩码的值是char

  3. 1是字符时,为什么还要强制转换? i只是<<操作符的值。

  4. ch=abcdefgh作为输入没有意义。 ch是char,因此ch只能是一个字符。

  5. 工作方式如下:首先,构造一个掩码,将不需要的所有位清零。 因此,例如,如果输入为ch = 204ch = 11001100 ),并且我们想知道第6位是否打开,则i =5。所以mask = 1 << 5 = 00100000 然后,通过与运算将该掩码应用于值。 这将使除所讨论位以外的所有内容都归零: 11001100 & 00100000 = 00000000 = 0 由于C中的0为假,因此未设置第6位。 在相同ch输入上且i = 6的另一个示例: mask = 1 << 6 = 01000000 ; 11001100 & 01000000 = 01000000 = 64 ,这不是0,因此为true,因此设置了第7位。

做:

return 0 != (mask & ch) ;

如果您想要布尔值(0x00000000或0x00000001)返回。 单独使用mask & ch可以为您提供正确位置所需的信息。

(其他人说的足以使i = 5等于第六位)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM