在字节的左边添加一个新位并丢弃字节的右位

时间:2011-03-31 02:37:58

标签: bit shift

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

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

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

有任何建议吗?

3 个答案:

答案 0 :(得分:1)

如果有一点

0x80 | (0xaa>>1) 

如果没有位

0x7F & (0xaa>>1) 

答案 1 :(得分: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

答案 2 :(得分:0)

在C中,如果是unsigned int,则可以执行以下操作。

在左侧添加logic 1位。

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

在左侧添加logic 0位。

x = x >> 1;

注意到在C中,>>由于unsigned int而属于logical shift,因此在向右移动时会向左侧放置logic 0位。

另请注意,0x8000000只会因unsigned int中的额外位而有效。