📜  C中的showbits()函数及示例

📅  最后修改于: 2021-05-25 19:45:02             🧑  作者: Mango

按位运算符是在二进制级别对int和uint进行运算的运算符(就像+,*,&&等)。这意味着它们直接查看整数的二进制数字或位。这一切听起来很吓人,但实际上,按位运算运算符非常易于使用,也非常有用!但是,重要的是要了解二进制数和十六进制数。

按位运算符

让我们看一下不同的按位运算运算符:

  1. &(按位与)
  2. | (按位或)
  3. 〜(按位非)
  4. ^(按位XOR)
  5. <<(按位左移)
  6. >>(按位右移)
  7. >>>(按位无符号右移)
  8. &=(按位与分配)
  9. | =(按位或分配)
  10. ^ =(按位XOR分配)
  11. << =(按位左移和赋值)
  12. >> =(按位右移和赋值)
  13. >>> =(按位无符号右移和赋值)

在本文中,重点是showbits()函数。让我们看一下它与按位运算符的关系。

showbits()函数

此函数主要处理按位运算运算符的概念。让我们看一下下面的C程序,以了解showbits()函数。

C
// C program to demonstrate the
// showbits() function
#include 
void showbits (int n)
{
  int i, k, andmask;
  
  for (i = 15; i >= 0;i--)
  {
    andmask = 1 << i;
    k = n & andmask;
    k == 0 ? printf ("0") : printf ("1");
  }
} 
  
// Driver code
int main() 
{
  showbits(5);    
  return 0;
}


C
// C program to implement the 
// above approach
#include 
#include 
  
char digits[] = 
     "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  
void reverse(char* start, char* end)
{
  for(end--; start < end; start++, end--)
  {
    char t = *start;
    *start = *end;
    *end = t;
  }
}
  
int base_change(int n, 
                int base, char* buffer)
{
  int pos = 0;
    
  if (base > strlen(digits)) 
    return -1;
  while(n)    
  {
    buffer[pos] = digits[n % base];
    n /= base;
    pos++;
  }
    
  buffer[pos] = '\0';
  reverse(buffer, buffer + pos);
  return 0;
}
  
// Driver code
int main() 
{
  char buffer[32];
  int conv = base_change(1024, 
                         2, buffer);
  if (conv == 0) 
    printf("%s\n", buffer);
  return 0;
}


输出
0000000000000101

解释

  1. 此函数所做的全部工作都是使用AND运算符和变量andmask。 andmask变量用于检查各个位的状态。如果该位为OFF,则打印0,否则打印1。
  2. 第一次通过循环,变量和掩码将包含值1000000000000000,该值是通过左移15位获得的。
  3. 如果变量n的最高有效位为0,则k将包含一个值0,否则,它将包含一个非零值。
  4. 如果k包含0,则printf()将输出0,否则将输出1。
  5. 在循环的第二次循环中,i的值减小,因此andmask的值更改,现在为100000000000000。这将检查下一个最高有效位是1还是0,并相应地打印出来。对数字中的所有位重复相同的操作。

如果需要十进制数字的二进制,那么基本上所有整数在计算机中实际上都是二进制的。只是将其转换为一个字符串,该字符串是使用printf和“%d”打印时该值的十进制表示形式。如果要求使用其他基数(例如,基数2或二进制),请提供适当的printf格式字符串(如果存在)(例如,“%x”代表十六进制),或者仅构建该字符串并打印出来。

下面的代码可以在[2,36]中的任何基数中构建整数的字符串表示形式。

C

// C program to implement the 
// above approach
#include 
#include 
  
char digits[] = 
     "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  
void reverse(char* start, char* end)
{
  for(end--; start < end; start++, end--)
  {
    char t = *start;
    *start = *end;
    *end = t;
  }
}
  
int base_change(int n, 
                int base, char* buffer)
{
  int pos = 0;
    
  if (base > strlen(digits)) 
    return -1;
  while(n)    
  {
    buffer[pos] = digits[n % base];
    n /= base;
    pos++;
  }
    
  buffer[pos] = '\0';
  reverse(buffer, buffer + pos);
  return 0;
}
  
// Driver code
int main() 
{
  char buffer[32];
  int conv = base_change(1024, 
                         2, buffer);
  if (conv == 0) 
    printf("%s\n", buffer);
  return 0;
}
输出
10000000000

说明:函数base_change()显示任何整数或字符值的二进制表示形式。现在,仅知道base_change()函数显示整数的二进制等效值就足够了。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。