Forums

Skip to content

Advanced search
  • Quick links
    • Unanswered topics
    • Active topics
    • Search
  • FAQ
  • Login
  • Register
  • Board index International Gentoo Users Deutsches Forum (German) Diskussionsforum
  • Search

Bash: gesetztes Bit testen

Unterhaltung über Gentoo und andere Themen: Alles was nicht in ein Support-Forum gehört.
Post Reply
  • Print view
Advanced search
6 posts • Page 1 of 1
Author
Message
musv
Advocate
Advocate
User avatar
Posts: 3380
Joined: Sun Dec 01, 2002 4:13 pm
Location: de

Bash: gesetztes Bit testen

  • Quote

Post by musv » Fri Jul 31, 2015 5:22 am

Guten Morgen,

ich bastel mir grad ein Wakeup-Script für meinen HTPC. VDR nutzt für den Aufnahmestatus eine Bitmaske:

1 - Timer ist aktiviert / deaktiviert
2 - Direktaufnahme (Record auf der Fernbedienung gedrückt)
4 - VPS
8 - VDR nimmt grad was auf.

Das geplante Script wird beim Runterfahren des Rechners ausgeführt. D.h. ich muss in der Bitmaske testen, ob Bit 1 gesetzt, Bit 2 und 8 nicht gesetzt sind. Die 4 ist egal.

Ausgeben kann man das auf die Art:

Code: Select all

echo $((9 & 8))
würde eine 1 ausgeben, da ja bekanntermaßen die 8 in der 9 drinsteckt.

Mein bisheriger Versuch:

Code: Select all

#!/bin/bash
is_active_timer()
{
    [ $(($1 & 0x1)) == 1 ] || return 1
    [ $(($1 & 0x2)) == 0 ] || return 1
    [ $(($1 & 0x8)) == 0 ] || return 1
    return 0
}


# main
while read TIMERS; do
    IFS=":"
    set -- $TIMERS
    echo "${1}"
    if is_active_timer "${1}" ; then
        echo "ja"
    else
        echo "nein"
    fi
    unset IFS
done < cat timers.conf
In meiner Funktion ist aber noch der Wurm drin. Hab da schon verschiedene Varianten durchgespielt, aber nur die erste Zeile klappt, d.h. Test auf das 1. Bit (von rechts).

Wie krieg ich das am elegantesten gebacken?
Top
mv
Watchman
Watchman
User avatar
Posts: 6795
Joined: Wed Apr 20, 2005 12:12 pm

Re: Bash: gesetztes Bit testen

  • Quote

Post by mv » Fri Jul 31, 2015 3:37 pm

musv wrote:unset IFS
Das darf man nicht: Dadurch verliert IFS seine spezielle Bedeutung.
Top
mastacloak
Apprentice
Apprentice
Posts: 174
Joined: Sun Aug 01, 2004 10:40 pm
Location: Berlin / Germany

Re: Bash: gesetztes Bit testen

  • Quote

Post by mastacloak » Fri Aug 14, 2015 11:34 pm

musv wrote: In meiner Funktion ist aber noch der Wurm drin. Hab da schon verschiedene Varianten durchgespielt, aber nur die erste Zeile klappt, d.h. Test auf das 1. Bit (von rechts).

Wie krieg ich das am elegantesten gebacken?
Was genau funktioniert denn nicht? Bei 1 (nur Bit 1 gesetzt 2^0=1) und 5 (Bit 1 und Bit 3 gesetzt 2^0+2^2=5), gibt deine Funktion als exit status 0 zurück, sonst 1.
Das ist doch laut deiner Beschreibung das was du wolltest, oder?

Hast du in deiner Beschreibung die Bitposition oder den Wert der Bitmaske angegeben?
Wenn du tatsächlich Bit 8 extrahieren wolltest, dann müsstest du mit 0x80 (dezimal 128) maskieren.
0x8 ist Bit 4.

Die Funktion is_active_timer() ist etwas umständlich und ineffizient. Sie ließe sich zusammenschrumpfen auf

Code: Select all

is_active_timer() { ((($1 & 0xB) == 1)); }
aber es ging dir ja nicht unbedingt um Effizienz.
Top
toralf
Developer
Developer
User avatar
Posts: 3944
Joined: Sun Feb 01, 2004 2:58 pm
Location: Hamburg
Contact:
Contact toralf
Website

Re: Bash: gesetztes Bit testen

  • Quote

Post by toralf » Sat Aug 15, 2015 1:03 pm

musv wrote:

Code: Select all

echo $((9 & 8))
würde eine 1 ausgeben, da ja bekanntermaßen die 8 in der 9 drinsteckt.

Code: Select all

# echo $((9 & 8))
8
die 7, die steckt da auch noch drin usw !
:-D
Top
musv
Advocate
Advocate
User avatar
Posts: 3380
Joined: Sun Dec 01, 2002 4:13 pm
Location: de

Re: Bash: gesetztes Bit testen

  • Quote

Post by musv » Sat Aug 15, 2015 2:23 pm

toralf wrote:die 7, die steckt da auch noch [in der 9] drin usw !
:-D
Nee, tut sie nicht. :P

Um das Forum aber mal an meinen weiteren Erkenntnissen teilhaben zu lassen:

Der Rückgabewert ist bei den Abfragen der Bits nicht, wie ich fälschlicherweise angenommen hab, immer 1 sondern entspricht dem zu prüfenden Bit. Also

Code: Select all

echo $((6 & 2))
2
Meine Funktion hab ich dann so gebastelt:

Code: Select all

is_active_timer()
{
    [[ $(echo $(($1 & 1))) == 1 ]] || return 1
    [[ $(echo $(($1 & 2))) -gt 0 ]] && return 1
    [[ $(echo $(($1 & 8))) -gt 0 ]] && return 1
    return 0
}
Top
toralf
Developer
Developer
User avatar
Posts: 3944
Joined: Sun Feb 01, 2004 2:58 pm
Location: Hamburg
Contact:
Contact toralf
Website

Re: Bash: gesetztes Bit testen

  • Quote

Post by toralf » Sat Aug 15, 2015 3:51 pm

musv wrote:
toralf wrote:die 7, die steckt da auch noch [in der 9] drin usw !
:-D
Nee, tut sie nicht. :P
*prust* - da kam ich mit meiner Schadenfreude ja nicht weit - ich werd' mal wieder Binärdarstellung üben müssen.
Top
Post Reply
  • Print view

6 posts • Page 1 of 1

Return to “Diskussionsforum”

Jump to
  • Assistance
  • ↳   News & Announcements
  • ↳   Frequently Asked Questions
  • ↳   Installing Gentoo
  • ↳   Multimedia
  • ↳   Desktop Environments
  • ↳   Networking & Security
  • ↳   Kernel & Hardware
  • ↳   Portage & Programming
  • ↳   Gamers & Players
  • ↳   Other Things Gentoo
  • ↳   Unsupported Software
  • Discussion & Documentation
  • ↳   Documentation, Tips & Tricks
  • ↳   Gentoo Chat
  • ↳   Gentoo Forums Feedback
  • ↳   Duplicate Threads
  • International Gentoo Users
  • ↳   中文 (Chinese)
  • ↳   Dutch
  • ↳   Finnish
  • ↳   French
  • ↳   Deutsches Forum (German)
  • ↳   Diskussionsforum
  • ↳   Deutsche Dokumentation
  • ↳   Greek
  • ↳   Forum italiano (Italian)
  • ↳   Forum di discussione italiano
  • ↳   Risorse italiane (documentazione e tools)
  • ↳   Polskie forum (Polish)
  • ↳   Instalacja i sprzęt
  • ↳   Polish OTW
  • ↳   Portuguese
  • ↳   Documentação, Ferramentas e Dicas
  • ↳   Russian
  • ↳   Scandinavian
  • ↳   Spanish
  • ↳   Other Languages
  • Architectures & Platforms
  • ↳   Gentoo on ARM
  • ↳   Gentoo on PPC
  • ↳   Gentoo on Sparc
  • ↳   Gentoo on Alternative Architectures
  • ↳   Gentoo on AMD64
  • ↳   Gentoo for Mac OS X (Portage for Mac OS X)
  • Board index
  • All times are UTC
  • Delete cookies

© 2001–2026 Gentoo Foundation, Inc.

Powered by phpBB® Forum Software © phpBB Limited

Privacy Policy

 

 

magic