基础知识:位运算

基础知识:位运算

  • 1. 两类表达式
  • 2. 项目中用到位运算的

1. 两类表达式



2. 项目中用到位运算的

在一个表中增加一个字段,控制报餐的6个字段包括午餐、晚餐、夜餐1、夜餐2、白班、晚班。正常在表中需要增加6个字段来做开关,但现在通过位运算只需要加一个字段。

具体的步骤如下:

  1. 定义一个整型变量,用于存储开启状态的位掩码。假设该变量名为stateMask

  2. 对于每个字段,定义一个与之对应的位掩码值,并使用<<运算符将其左移相应位置。假设这些字段的位掩码变量名分别为dayshiftMasknightshiftMasklunchMaskdinnerMasknight1Masknight2Mask

  3. 在设置字段的开启状态时,使用stateMask与对应的位掩码进行按位或操作,即使用|运算符。例如,要设置dayshift_time字段的开启状态,使用stateMask |= dayshiftMask;

  4. 在关闭字段的开启状态时,使用stateMask与对应的位掩码进行按位与操作,然后再取反,即使用~运算符。例如,要关闭nightshift_time字段的开启状态,可以使用stateMask &= ~nightshiftMask;

  5. 检查字段的开启状态时,使用stateMask与对应的位掩码进行按位与操作,然后再判断结果是否为0。如果结果为0,则表示对应的字段为关闭状态;如果结果不为0,则表示对应的字段为开启状态。例如,要检查lunch_time字段是否开启,可以使用(stateMask & lunchMask) != 0进行判断。

栗子代码

public class ConfigFieldControl {
    private static final int dayshiftMask = 1 << 0;     // 00000001
    private static final int nightshiftMask = 1 << 1;   // 00000010
    private static final int lunchMask = 1 << 2;        // 00000100
    private static final int dinnerMask = 1 << 3;       // 00001000
    private static final int night1Mask = 1 << 4;       // 00010000
    private static final int night2Mask = 1 << 5;       // 00100000

    public static void main(String[] args) {
        int stateMask = 0;

        // 开启 dayshift_time 和 lunch_time 字段
        stateMask |= dayshiftMask;
        stateMask |= lunchMask;
		
		// 关闭lunch_time
		stateMask &= ~lunchMask

        // 检查字段的开启状态
        boolean isDayshiftTimeEnabled = (stateMask & dayshiftMask) != 0;
        boolean isNightshiftTimeEnabled = (stateMask & nightshiftMask) != 0;
        boolean isLunchTimeEnabled = (stateMask & lunchMask) != 0;
        boolean isDinnerTimeEnabled = (stateMask & dinnerMask) != 0;
        boolean isNight1TimeEnabled = (stateMask & night1Mask) != 0;
        boolean isNight2TimeEnabled = (stateMask & night2Mask) != 0;

        System.out.println("dayshift_time is enabled: " + isDayshiftTimeEnabled);
        System.out.println("nightshift_time is enabled: " + isNightshiftTimeEnabled);
        System.out.println("lunch_time is enabled: " + isLunchTimeEnabled);
        System.out.println("dinner_time is enabled: " + isDinnerTimeEnabled);
        System.out.println("night1_time is enabled: " + isNight1TimeEnabled);
        System.out.println("night2_time is enabled: " + isNight2TimeEnabled);
    }
}

总结:

  1. 这种设置可以实现对多个字段的开启与关闭状态的控制,是因为它利用了位运算的特性和位掩码的概念。

  2. 在这个设置中,每个字段都有一个对应的位掩码,通过将位掩码与状态掩码进行按位与或按位非的操作,可以实现对字段的开启和关闭。

  3. 具体来说,每个字段的位掩码是一个唯一的二进制值,其中只有一个位为1,其余位为0。位掩码可以通过左移操作符<<来生成,将1左移相应的位数。

  4. 当要将某个字段设置为开启状态时,将该字段的位掩码与状态掩码进行按位或操作,相当于将该位设置为1,其他位保持不变。这样就能表示该字段为开启状态。

  5. 当要将某个字段设置为关闭状态时,将该字段的位掩码取反后与状态掩码进行按位与操作,相当于将该位设置为0,其他位保持不变。这样就能表示该字段为关闭状态。

  6. 通过按位与运算,可以将状态掩码中的1只保留在对应位为1的字段的位掩码上,其他位都变为0。然后再进行条件判断,若结果不为0,则表示对应的字段为开启状态。

  7. 这种方式可以节省存储空间,每个字段的开启状态只占用一个位,而不是使用额外的布尔值或整型来记录每个字段的状态。同时,通过位运算,可以很方便地实现对多个字段的同时开启和关闭。

你可能感兴趣的:(解决问题合集,c语言)