C 和 PHP:使用按位运算符将设置存储在整数中?

2022-08-31 00:11:23

我不熟悉按位运算符,但我似乎以前习惯于存储简单的设置。

我需要将几个开/关选项传递给一个函数,并且我想为此使用单个整数。如何设置和阅读这些选项?


答案 1

你肯定可以在PHP中做到这一点。

假设您要在单个值中存储四个布尔值。这意味着我们需要四位存储空间

0000

每个位,当单独设置时,都有一个唯一的十进制表示

0001 = 1 // or 2^0
0010 = 2 // or 2^1
0100 = 4 // or 2^2
1000 = 8 // or 2^3

实现此目的的常用方法是使用位掩码来表示每个选项。例如,PHP的错误级别就是以这种方式完成的。

define( 'OPT_1', 1 );
define( 'OPT_2', 2 );
define( 'OPT_3', 4 );
define( 'OPT_4', 8 );

然后,当您有一个表示0个或多个这些标志的整数时,您可以使用按位和运算符进行检查,该运算符是&

$options = bindec( '0101' );
// can also be set like this
// $options = OPT_1 | OPT_3;

if ( $options & OPT_3 )
{
  // option 3 is enabled
}

此运算符的工作原理如下:结果中仅设置在两个操作数中设置的位

0101 // our options
0100 // the value of OPT_3
----
0100 // The decimal integer 4 evaluates as "true" in an expression

如果我们对照 它进行检查,那么结果将如下所示OPT_2

0101 // our options
0010 // the value of OPT_2
----
0000 // The decimal integer 0 evaluates as "false" in an expression

答案 2

它在两种语言中的工作方式几乎相同,并排比较:

C:

#include <stdio.h>
#include <stdint.h>

#define FLAG_ONE 0x0001
#define FLAG_TWO 0x0002
#define FLAG_THREE 0x0004
#define FLAG_FOUR 0x0008
#define FLAG_ALL (FLAG_ONE|FLAG_TWO|FLAG_THREE|FLAG_FOUR)

void make_waffles(void)
{
   printf("Yummy! We Love Waffles!!!\n");
}

void do_something(uint32_t flags)
{
    if (flags & FLAG_TWO)
         make_waffles();
}

int main(void)
{
    uint32_t flags;

    flags |= FLAG_ALL;

    /* Lets make some waffles! */
    do_something(flags);

    return 0;
}

菲律宾比索:

<?php

define("FLAG_ONE", 0x0001);
define("FLAG_TWO", 0x0002);
define("FLAG_THREE", 0x0004);
define("FLAG_FOUR", 0x0008);
define("FLAG_ALL", FLAG_ONE|FLAG_TWO|FLAG_THREE|FLAG_FOUR);

function make_waffles()
{
    echo 'Yummy! We Love Waffles!!!';
}

function do_something($flags)
{
    if ($flags & FLAG_TWO)
       make_waffles();
}

$flags |= FLAG_TWO;
do_something($flags);

?>

注意,你绝对不需要使用常量,我只是出于习惯使用它们。这两个例子都会运行,我通过编译了C版本。在任何一个例子中,除了或(可悲的是)不会制作华夫饼之外的任何东西。gcc -Wall flags.c -o flagsflagsFLAG_TWOFLAG_ALL

在C版本中,您不必挠痒痒预处理器,它很容易成为枚举等 - 这对读者来说是一个练习。


推荐