0

每个人!如果有一个新位要插入一个字节,我该如何解决?例如:

如果有一个新的位 1 到一个字节(例如 0xaa) 10101010==>11010101

如果有一个新位 0 t0 一个字节(例如 0xaa) 10101010==>01010101

有什么建议吗?

4

3 回答 3

1

如果有一点

0x80 | (0xaa>>1) 

如果没有一点

0x7F & (0xaa>>1) 
于 2011-03-31T02:44:29.990 回答
1

这是一个奇怪的要求,但可以做到。这段代码有两个参数:第一个是整数形式的原始字节,第二个是要在位移后以 0 或 1 形式添加到左侧的位。使用整数很容易向右移位;只需除以 2,余数就会被丢弃。让我们取 2 的 7 次方并将其存储在 @FlagNumber 变量中以用于我们的计算。

如果我们想将左边的位设置为零,我们需要先检查该值。第八位的位应该已经为零,但让我们检查一下,以防有人传递了一个大于 255 的值,让我们检查一下。如果出于某种原因将其设置为 1,我们将使用简单的 ^ (xor) 将其关闭。

如果我们想将左边的位设置为 1,我们将使用一个简单的 | (或)打开)

我将把它全部包装在一个函数中,这就是你得到的。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Jacob Raines
-- Create date: 2013-04-03
-- Description: Shift byte to the right and set 8th bit
-- =============================================
CREATE FUNCTION dbo.Flag_ByteAppendLeft
(
    @InputByte int,     --10101010
    @InputBit int       --0 or 1
)
RETURNS int
AS
BEGIN
    /* Examples & Notes 
        SELECT dbo.Flag_ByteAppendLeft(170, 1)  --(10101010, 1) Should Return 11010101 (213)
        SELECT dbo.Flag_ByteAppendLeft(170, 0)  --(10101010, 0) Should Return 01010101 ( 85)
    */
    DECLARE @OutputByte int
    DECLARE @FlagPower as int
    DECLARE @FlagNumber as int

    SET @OutputByte = @InputByte / 2 --Bit Shift once to the right
    SET @FlagNumber = 7 --Flag 7 (starting at 0) is the 8th bit.
    SET @FlagPower = POWER(2, @FlagNumber)  

    IF (@InputBit = 0)
    BEGIN
        IF (@OutputByte & @FlagPower = @FlagPower)  -- If set
        BEGIN
            SET @OutputByte = @OutputByte ^ @FlagPower  -- Then Toggle Flag with xor
        END
    END
    ELSE
    BEGIN
        SET @OutputByte = @OutputByte | @FlagPower      -- Set Flag
    END

    RETURN @OutputByte
END
GO
于 2013-04-03T14:21:22.537 回答
0

在 C 中,如果它是unsigned int.

logic 1在左边加一点。

x = 0x80000000 | (x >> 1);

logic 0在左边加一点。

x = x >> 1;

请注意,在 C 中,由于,>>逻辑移位,因此在右移时会向左unsigned int放置一个位。logic 0

还要注意,这0x8000000只会因为unsigned int.

于 2013-07-21T19:48:41.963 回答