首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 二進制字符串取反操作:全位取反與低四位取反的高效實現

     編輯:程式設計綜合問答

需求描述

給定二進制字符串 "1111 1111"(或無空格 "11111111"),需要實現兩種操作:

  1. 全位取反:每一位 0↔1,結果為 "0000 0000"。
  2. 低四位取反:僅對右側 4 位取反,結果為 "1111 0000"。

優先使用 .NET 框架內置方法,避免手動逐字符處理。

核心思路:數值轉換 + 位運算 + 格式化輸出

將二進制字符串 → 整數 → 位運算 → 二進制字符串,比字符串操作高效且不易出錯。

完整實現代碼

using System;

public class BinaryFlipDemo
{
    public static void Main()
    {
        string binaryStr = "11111111"; // 輸入可帶空格,先清理
        binaryStr = binaryStr.Replace(" ", ""); // 移除空格

        // 1. 字符串 → 字節 (byte 足夠 8 位)
        byte value = Convert.ToByte(binaryStr, 2); // 基數 2 解析

        // 2. 全位取反 (按位非 ~)
        byte flippedAll = (byte)~value; // 需轉回 byte 截斷高位
        Console.WriteLine($"全位取反: {ToBinaryString(flippedAll)}"); // 00000000

        // 3. 低四位取反 (與 0x0F 異或 ^)
        byte flippedLow4 = (byte)(value ^ 0x0F); // 0x0F = 00001111
        Console.WriteLine($"低四位取反: {ToBinaryString(flippedLow4)}"); // 11110000

        // 4. 通用方法:指定位數取反
        Console.WriteLine($"高四位取反: {ToBinaryString(FlipBits(value, 4, 4))}"); // 00001111
        Console.WriteLine($"第 2-5 位取反: {ToBinaryString(FlipBits(value, 1, 4))}"); // 11110011
    }

    /// 
    /// 將字節格式化為 8 位二進制字符串 (可選帶空格)
    /// 
    static string ToBinaryString(byte b, bool withSpace = true)
    {
        string s = Convert.ToString(b, 2).PadLeft(8, '0');
        return withSpace ? s.Insert(4, " ") : s;
    }

    /// 
    /// 通用位翻轉:從 startBit (0=LSB) 開始,翻轉 count 位
    /// 
    static byte FlipBits(byte value, int startBit, int count)
    {
        if (startBit < 0 || count <= 0 || startBit + count > 8) 
            throw new ArgumentOutOfRangeException();
        
        byte mask = (byte)(((1 << count) - 1) << startBit); // 生成掩碼
        return (byte)(value ^ mask); // 異或翻轉
    }
}

關鍵 API 說明

方法用途示例
Convert.ToByte(str, 2)二進制字符串 → 字節Convert.ToByte("1111", 2) = 15
Convert.ToString(val, 2)數值 → 二進制字符串Convert.ToString(15, 2) = "1111"
~value按位取反 (所有位)~15 = -16 → (byte)~15 = 240
value ^ mask異或操作實現指定位翻轉15 ^ 0x0F = 240

擴展:處理更長的二進制數據

若超過 8 位(如 16、32、64 位),使用 ushort、uint、ulong 對應 Convert.ToUInt16/32/64,位運算邏輯完全一致。

避坑指南

  • 符號位問題:對有符號類型(int、short)用 ~ 會保留符號位,建議用無符號類型或顯式掩碼。
  • 字符串清理:解析前務必 Replace(" ", "") 移除空格/下劃線等分隔符。
  • 位寬匹配:掩碼生成時注意移位不超過類型位寬(如 1 << 32 在 int 上未定義行為)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved